Hãy khởi đầu nhanh chóng với DB2 9 pureXML, Phần 5: Phát triển các ứng dụng Java với dữ liệu XML của DB2

DB2 phiên bản V9 của IBM cho Linux, UNIX và Windows mô tả sự hỗ trợ mới quan trọng để lưu trữ, quản lý và truy vấn dữ liệu XML. Trong loạt bài này, bạn sẽ tìm hiểu những vấn đề cơ bản về cách viết các ứng dụng Java truy cập dữ liệu XML mới. Bạn sẽ thấy cách chèn, truy vấn, cập nhật và xóa dữ liệu XML, cách tạo các thủ tục được lưu trữ để truy cập dữ liệu XML và còn nhiều hơn nữa.

Lưu ý: Bài viết này đã được cập nhật để theo kịp với các thay đổi trong DB2 phiên bản 9.5 và 9.7 cho Linux, UNIX và Windows.

Cynthia M. Saracco, Kiến trúc giải pháp cao cấp, IBM

Cynthia M. Saracco là kiến trúc sư giải pháp cao cấp tại Phòng thí nghiệm ở Thung lũng Silicon của IBM, bà chuyên về các công nghệ mới xuất hiện và các chủ đề quản lý cơ sở dữ liệu. Bà có 23 năm kinh nghiệm về công nghiệp phần mềm, đã viết 3 cuốn sách và hơn 60 tài liệu kỹ thuật và có 7 bằng sáng chế.



25 03 2010 (Xuất bản lần đầu tiên vào ngày 10 08 2011)

Trong bài này, chúng ta sẽ đi qua một vài kịch bản lập trình phổ biến, chẳng hạn như chèn dữ liệu XML, truy vấn dữ liệu XML và dữ liệu không-XML, cập nhật dữ liệu XML, xóa dữ liệu XML và tạo các thủ tục được lưu trữ để truy cập dữ liệu XML. Nhưng trước tiên, chúng ta hãy xem một số hướng dẫn cơ bản để phát triển bất kỳ loại ứng dụng cơ sở dữ liệu DB2 nào.

Làm theo "các bài thực hành tốt nhất" về lập trình điển hình

Mặc dù sự hỗ trợ XML nguyên gốc của DB2 là cơ sở dữ liệu mới là tốt thì các bài thực hành lập trình ứng dụng vẫn chưa thay đổi. Trước khi đi sâu vào các chi tiết về công nghệ XML của DB2, hãy nhớ các nguyên tắc chung sau:

  • Chỉ yêu cầu những gì bạn cần: Không lấy toàn bộ nội dung của một bảng -- hoặc toàn bộ nội dung của nhiều tài liệu XML -- khi bạn chỉ cần một tập con của các thông tin này. Bạn sẽ chỉ làm tăng chi phí xử lý và làm chậm hiệu năng thời gian chạy.
  • Tránh lặp lại công việc của máy chủ cơ sở dữ liệu: Ra lệnh cho DB2 lọc và xử lý dữ liệu theo các yêu cầu của bạn thay vì thực hiện công việc này trong ứng dụng của bạn. Ví dụ, nếu bạn có DB2 trả về các kết quả theo một thứ tự nhất định, bạn sẽ không cần sắp xếp dữ liệu cho mình. Tương tự, nếu bạn có DB2 đảm bảo chỉ trả về các kết quả khác nhau, bạn sẽ không phải kiểm tra lại các bản sao. Chính máy chủ dữ liệu chứ không phải ứng dụng của bạn thực hiện tốt nhất việc xử lý tập trung dữ liệu.
  • Làm cho mã của bạn dễ bảo trì: Bao gồm các ý kiến hoặc Javadoc trong mã của bạn, đặc biệt nếu ứng dụng của bạn có chứa các truy vấn phức tạp.
  • Hãy xem xét cẩn thận phạm vi giao dịch của bạn: Theo mặc định, JDBC xử lý từng truy vấn như là một giao dịch độc lập. Xác định xem điều này có phù hợp với nhu cầu của bạn không và cũng xem xét phạm vi (và mức cô lập) mà bạn định nghĩa cho các giao dịch của bạn có thể tác động đến toàn bộ các yêu cầu đồng thời như thế nào.
  • Giảm thiểu lưu lượng trong các môi trường có nối mạng: Bạn sẽ có được hiệu năng thời gian chạy tốt hơn nếu bạn tránh truyền dữ liệu không cần thiết giữa các ứng dụng của bạn và DB2. Chỉ lấy dữ liệu mà bạn cần là một cách để làm điều này. Gọi các thủ tục được lưu trữ của cơ sở dữ liệu cũng có thể hỗ trợ, tùy theo tính chất công việc của bạn.

Cấu hình môi trường của bạn

DB2 không đòi hỏi bất kỳ cấu hình đặc biệt nào để cho phép bạn phát triển hoặc chạy các ứng dụng Java làm việc với dữ liệu XML. Thật vậy, bạn có thể viết, thử nghiệm và gỡ lỗi các chương trình Java của mình khi sử dụng môi trường phát triển tích hợp (IDE) theo sự lựa chọn của bạn hoặc khi làm việc trực tiếp với một Java Developer Kit (JDK-Bộ dung cụ của các nhà phát triển Java có hỗ trợ) từ dòng lệnh. Các ví dụ trong bài viết này sử dụng IBM Data Studio (hoặc Optim Development Studio) cho môi trường phát triển của nó. Phần này bàn về cách cấu hình Data Studio, xem lại một số dữ liệu mẫu và tìm hiểu các tham số cấu hình cơ sở dữ liệu mà bạn có thể quan tâm đến.

IBM Data Studio

Data Studio của IBM dựa trên nền tảng Eclipse 3.4, một dự án nguồn mở có sẵn để tải về miễn phí. Để biên dịch và chạy bất kỳ ứng dụng XML của DB2 nào với bàn làm việc này, bạn cần tạo một dự án và bao gồm các thư viện DB2 phù hợp trong đường dẫn xây dựng của dự án, bao gồm cả các thư viện hỗ trợ trình điều khiển tuân theo JDBC 4.0 của DB2. Để cấu hình môi trường của bạn, hãy hoàn thành các bước sau:

  1. Khởi chạy Data Studio.
  2. Tạo một dự án mới. Đầu tiên chúng ta sẽ sử dụng một dự án đơn giản. Chuyển sang phối cảnh Java (Window > Open Perspective > Java) và chọn File > New > Java Project (Dự án Java). Làm theo các trình thủ thuật để chỉ rõ tên của dự án. Với các mục khác, hãy giữ lại các thiết lập mặc định.
  3. Thêm các thư viện DB2 vào đường dẫn xây dựng dự án của bạn. Chọn dự án của bạn, nhấn chuột phải và chọn Properties (Các đặc tính). Chọn Java Build Path (Đường dẫn xây dựng Java), và nhấn vào thẻ Libraries (Các thư viện). Thêm các tệp .jar bên ngoài phù hợp của DB2, như db2jcc.jar, db2jcc_javax.jar, and db2jcc_license_cu.jar.
  4. Theo tùy chọn, tạo ra một gói cho ứng dụng của bạn. Chọn dự án của bạn, nhấn chuột phải và chọn New > Package.

Để biết chi tiết về việc tạo các dự án và các gói, hãy tham khảo thông tin trợ giúp trực tuyến.

Dữ liệu mẫu

Các ví dụ trong bài viết này làm việc với bảng "clients" (Các khách hàng) đã tạo ra trong bài "Hãy khởi đầu nhanh chóng với DB2 9, Phần 2" (developerWorks, 03.2006). Để giúp xem lại nhanh chóng, bảng này được định nghĩa như là:

Liệt kê 1. Liệt kê mã mẫu với chiều rộng tối đa
create table clients(
  id    		int primary key not null, 
  name  		varchar(50), 
  status 		varchar(10), 
  contactinfo 	xml
)

Liệt kê 2 mô tả một tệp XML mẫu sẽ được chèn ngay vào cột "contactinfo" của bảng này.

Liệt kê 2. Một tệp XML mẫu được chèn vào bảng "clients"
<?xml version="1.0"?>
<Client>
	<Address>
		<street>54 Moorpark Ave.</street>
		<city>San Jose</city>
		<state>CA</state>
		<zip>95110</zip>
	</Address>
	<phone>
		<work>4084630110</work>
		<home>4081114444</home>
		<cell>4082223333</cell>
	</phone>
	<fax>4087776688</fax>
	<email>sailer555@yahoo.com</email>
</Client>

Các tham số cấu hình cơ sở dữ liệu

Các ví dụ trong hướng dẫn này đơn giản và hoạt động với một lượng nhỏ dữ liệu XML, vì vậy bạn không cần thay đổi các tham số cấu hình cơ sở dữ liệu mặc định để làm cho chúng chạy. Tuy nhiên, các giá trị mặc định có thể không đủ cho một số môi trường sản xuất. Cụ thể là, các giá trị thiết lập về kích thước bản ghi, vùng lưu trữ đặc biệt (heap) của câu lệnh truy vấn của Java và vùng lưu trữ đặc biệt của ứng dụng có thể cần được tăng thêm. Nếu các giá trị này được thiết lập không phù hợp, hiệu năng thời gian chạy của bạn có thể chậm hoặc bạn có thể không có khả năng chèn các tài liệu XML lớn vào các bảng của DB2 do không đủ không gian ghi nhật ký.

Bạn có thể xem lại và thay đổi các tham số cấu hình cơ sở dữ liệu DB2 từ DB2 Control Center (Trung tâm điều khiển của DB2) (chọn Tools > Configuration Assistant) hoặc bộ xử lý dòng lệnh DB2. Hãy tham khảo hướng dẫn sử dụng sản phẩm để biết các chi tiết.

Kết nối tới cơ sở dữ liệu của bạn

Làm việc với dữ liệu XML của DB2 đòi hỏi thiết lập một kết nối đến cơ sở dữ liệu chứa dữ liệu của bạn. Không có gì đặc biệt về đoạn mã này - nó giống như logic mà bạn đã viết để kết nối với bất kỳ cơ sở dữ liệu DB2 nào.

Liệt kê 3 có một lớp trình trợ giúp (helper) với các phương thức để thiết lập và đóng một kết nối cơ sở dữ liệu DB2.

Liệt kê 3. Lớp trình trợ giúp để thu nhận và phát hành các kết nối cơ sở dữ liệu
public class Conn {
  // for simplicity, I've hard-coded account and URL data.
  private static String user = "user1";
  private static String pwd = "mypassword";
  private static String url = "jdbc:db2:test";

  // this method gets a database connection 	
  public static Connection getConn(){
    Connection conn=null;
		
    //  load the appropriate DB2 driver and 
    //  get a connection to the "test" database  
    try {
       Class.forName("com.ibm.db2.jcc.DB2Driver");
       conn = DriverManager.getConnection(url, user, pwd);
       . . . 	
    }
    catch (Exception e) { e.printStackTrace();	}
    return conn;
		
  }   // end getConn();
	
  // this method closes a database connection 
  public static void closeConn(Connection conn){
    try {
      if(conn == null) { return; }
      conn.close();
    }
    catch (Exception e) { e.printStackTrace(); }
    finally { 
      try { conn.close();  }
      catch (Exception e) { } 
    }
  }  // end closeConn();
}  // end class

Bạn sẽ gọi những phương thức này trong các ứng dụng thực hiện các nhiệm vụ lớn hơn, chẳng hạn như chèn và truy vấn dữ liệu XML.

Chèn dữ liệu XML

Vì đặc tả XQuery ban đầu đã không xử lý các hoạt động viết vào cơ sở dữ liệu (như chèn dữ liệu), DB2 dựa vào các câu lệnh INSERT quen thuộc của SQL để cho phép các lập trình viên viết dữ liệu XML mới vào các bảng có chứa các cột XML. DB2 có thể lưu trữ bất kỳ tài liệu XML đúng định dạng nào lên đến 2GB.

Thông thường, các lập trình viên Java cần chèn dữ liệu XML đã chứa trong các tệp vào DB2, mặc dù nó cũng có thể chèn dữ liệu XML từ các chuỗi ký tự, từ dữ liệu nhị phân (bao gồm cả các đối tượng lớn) và từ các câu lệnh chọn ở dưới của SQL. Ở đây cần cân nhắc về cách chèn dữ liệu XML từ các tệp và từ chuỗi ký tự đơn giản. Hãy tham khảo hướng dẫn sử dụng DB2 9 để biết chi tiết về các kịch bản chèn khác.

DB2 9 cũng cho phép bạn chèn các tài liệu XML có hoặc không xác nhận hợp lệ chúng dựa vào các lược đồ XML đã đăng ký trước. Các mẫu trong bài viết này trình bày cả hai cách tiếp cận.

Chèn tệp không xác nhận hợp lệ

Phương thức insertFile() trong Liệt kê 4 minh họa cách chèn dữ liệu từ một tệp XML vào cột "clients.contactinfo". Phương thức này bắt đầu bằng cách định nghĩa một số biến để sử dụng sau. Ba biến đầu tiên tương ứng với các cột mã định danh ID, tên và trạng thái trong bảng "clients". Biến thứ tư là tên của tệp XML được chèn vào cột "contactinfo". Để cho đơn giản, các giá trị đã được mã hóa cứng trong phương thức này; trong một môi trường sản xuất, sẽ thu được các giá trị đầu vào khác nhau.

Sau khi thiết lập một kết nối cơ sở dữ liệu, hãy tạo một chuỗi đơn giản cho câu lệnh INSERT của bạn. Như bạn thấy, nó trông giống như bất kỳ câu lệnh INSERT khác của DB2 và sử dụng các dấu tham số cho bốn giá trị cột đầu vào của bạn. Câu lệnh INSERT được chuẩn bị như thường lệ và bốn dấu tham số của nó được thiết lập. Để thiết lập dấu tham số cho cột XML, hãy mở một FileInputStream, chuyển vào vị trí của tệp XML của chúng ta. Ngoài ra hãy lấy chiều dài của tệp này và sử dụng thông tin này làm đầu vào cho phương thức setBinaryStream(). Cuối cùng, thực hiện câu lệnh, kiểm tra các lỗi và đóng kết nối.

Liệt kê 4. Chèn dữ liệu XML từ một tệp
public static void insertFile(){
  try {
    // for simplicity, I've defined variables with input data 
    int id = 1885;
    String name = "Amy Liu";
    String status = "Silver";
    String fn = "c:/XMLFiles/Client1885.xml";  // input file

    // get a connection 
    Connection conn = Conn.getConn();

    //   define string that will insert file without validation
    String query = "insert into clients (id, name, status, contactinfo) 
                                                    values (?, ?, ? ,?)";

    // prepare the statement
    PreparedStatement insertStmt = conn.prepareStatement(query);
    insertStmt.setInt(1, id);
    insertStmt.setString(2, name);
    insertStmt.setString(3, status);
    File file = new File(fn);
    insertStmt.setBinaryStream(4, new FileInputStream(file), (int)file.length());

    // execute the statement 
    if (insertStmt.executeUpdate() != 1) {
        System.out.println("No record inserted.");
    }
    . . . 
    conn.close();
  }
  catch (Exception e) { . . . }
}

Chèn tệp có xác nhận hợp lệ

Chèn một tệp XML có xác nhận hợp lệ đòi hỏi một chút nỗ lực lập trình bổ sung. Giả sử bạn đã tạo ra và đã đăng ký tệp ClientInfo.xsd như đã thảo luận trong bài "Hãy khởi đầu nhanh chóng với DB2 9, Phần 2" (developerWorks, 03.2006), bạn chỉ cần thay đổi một dòng mã trong Liệt kê 4 để ra lệnh cho DB2 chèn tệp XML có xác nhận hợp lệ. Mã này liên quan đến định nghĩa về chuỗi query.

Như trong Liệt kê 5, câu lệnh INSERT đã chỉnh sửa gọi hàm XMLValidate trước khi xác định một dấu tham số cho dữ liệu XML. Hàm này cũng yêu cầu bạn chỉ rõ trình định danh của lược đồ XML được sử dụng để xác nhận hợp lệ. Ở đây, có tham chiếu đến một lược đồ đã đăng ký trước được gọi là "user1.mysample".

Liệt kê 5. Chèn dữ liệu XML từ một tệp có xác nhận hợp lệ
String query = "INSERT INTO clients (id, name, status contactinfo) " +
    "VALUES (?, ?, ?, xmlvalidate(? according to xmlschema id user1.mysample))";

Nếu tệp XML đầu vào của bạn có chứa dữ liệu là hợp lệ theo lược đồ đã quy định, DB2 chèn hàng này. Nếu không, toàn bộ câu lệnh sẽ sai và không có dữ liệu nào được chèn vào hàng này.

Chèn chuỗi ký tự không xác nhận hợp lệ

Phương thức insertString() trong Liệt kê 5 minh họa cách bạn có thể chèn một tài liệu XML đúng định dạng được gán cho một biến chuỗi ký tự trong DB2. Logic này không khác nhiều so với ví dụ trước về chèn dữ liệu từ một tệp. Thay vì sử dụng phương thức setBinaryStream() của câu lệnh đã chuẩn bị của bạn, hãy sử dụng phương thức setString(). Để đơn giản, tài liệu XML trong định nghĩa biến xml đã được mã hóa cứng trong ví dụ này.

Lưu ý: Có các ký tự thoát (các vạch chéo ngược) trước các dấu ngoặc kép là một phần của tài liệu XML (ví dụ như số phiên bản XML trong ví dụ dưới đây).

Liệt kê 6. Chèn dữ liệu XML từ một chuỗi ký tự
public static void insertString(){
  try {
    // for simplicity, I've defined variables with input data 
    int id = 1885;
    String name = "Amy Liu";
    String status = "Silver";
    String xml = 
      "<?xml version=\"1.0\"?>" + 
      "<Client>" + 
      "<Address> " +
        "<street>54 Moorpark Ave.</street>" +
        "<city>San Jose</city>" +
        "<state>CA</state>" +
        "<zip>95110</zip>" +
      "</Address>" +
      "<phone>" +
        "<work>4084630110</work>" +
        "<home>4081114444</home>" +
        "<cell>4082223333</cell>" +
      "</phone>" +
      "<fax>4087776688</fax>" +
      "<email>sailer555@yahoo.com</email>" +
      "</Client>";

    // get a connection 
    Connection conn = Conn.getConn();

    //   define string that will insert file without validation
    String query = "insert into clients (id, name, status, contactinfo) 
                                                     values (?, ?, ? ,?)";

    // prepare the statement
    PreparedStatement insertStmt = conn.prepareStatement(query);
    insertStmt.setInt(1, id);
    insertStmt.setString(2, name);
    insertStmt.setString(3, status);
    insertStmt.setString(4, xml); 

    // execute the statement 
    if (insertStmt.executeUpdate() != 1) {
        System.out.println("No record inserted.");
    }
    . . . 
    conn.close();
  }
  catch (Exception e) { . . . }
}

Chèn chuỗi ký tự có xác nhận hợp lệ

Như bạn có thể mong đợi, việc xác nhận hợp lệ các tài liệu XML, được đưa ra như là các chuỗi ký tự, đòi hỏi nỗ lực lập trình thêm một chút. Thật vậy, chỉ có một dòng mã cần được sửa đổi -- định nghĩa của biến query. Bạn chỉ cần thay đổi câu lệnh INSERT để gọi hàm XMLValidate, cũng giống như bạn đã làm trong Liệt kê 5.

Đây là câu lệnh đã chỉnh sửa:

Liệt kê 7. Chèn dữ liệu XML từ một chuỗi ký tự có xác nhận hợp lệ
String query = "INSERT INTO clients (id, name, status contactinfo) " +
    "VALUES (?, ?, ?, xmlvalidate(? according to xmlschema id user1.mysample))";

Truy vấn dữ liệu XML

Bây giờ bạn biết cách chèn dữ liệu XML vào DB2 bằng cách sử dụng một chương trình Java, bạn đã sẵn sàng để truy vấn dữ liệu XML. Hãy đi dần qua một vài ví dụ trong phần này, bắt đầu với một nhiệm vụ đơn giản (chẳng hạn như lấy toàn bộ một tài liệu XML) và tiến lên nhiều nhiệm vụ khó khăn hơn (như trả về các phần của các tài liệu XML dựa trên các biến vị ngữ XML và các biến vị ngữ truy vấn quan hệ).

Mặc dù DB2 hỗ trợ cả SQL lẫn XQuery như là các ngôn ngữ cấp cao nhất, XQuery không cung cấp một phương tiện để giải quyết các dấu tham số. Trong thực tế, điều này có nghĩa là bất kỳ các XQuery nào trong ứng dụng của bạn đòi hỏi nhiều các biến vị ngữ truy vấn mã hóa cứng hơn phải được bọc trong một câu lệnh SQL nhờ sử dụng hàm SQL/XML như là XMLQuery hay XMLExists. Bài "Hãy khởi đầu nhanh chóng với DB2 9, Phần 3: Truy vấn dữ liệu DB2 XML bằng SQL" (developerWorks, 03.2006) thảo luận các hàm này chi tiết hơn. Ở đây, bạn sẽ thấy cách sử dụng chúng trong một chương trình Java. Và, chỉ để cho vui, bạn cũng sẽ thấy cách bao gồm một truy vấn XQuery với các biến vị ngữ truy vấn mã hóa cứng trong một ứng dụng.

Lấy toàn bộ các tài liệu XML

Phương thức dựa trên truy vấn đầu tiên của chúng ta khá đơn giản. Nó chỉ lấy toàn bộ thông tin liên hệ của một khách hàng cụ thể. Một truy vấn về tính chất này có thể được thể hiện dễ dàng trong SQL. Vì vậy, nếu bạn quen với JDBC, bạn sẽ dễ dàng hiểu được mã này.

Phương thức simpleQuery() trong Liệt kê 8 khai báo một số biến và sau đó thiết lập một kết nối cơ sở dữ liệu bằng cách sử dụng một phương thức trình trợ giúp được định nghĩa trong Liệt kê 2. Chuỗi query chứa một câu lệnh SQL đơn giản để chọn tất cả các thông tin liên hệ của một khách hàng cụ thể. Sau khi thực hiện câu lệnh này, ứng dụng in ra các kết quả đã được tìm nạp vào một biến chuỗi ký tự (stringDoc).

Liệt kê 8. Lấy toàn bộ các tài liệu XML bằng SQL
import java.sql.*;
 . . . 
public static void simpleQuery() {
  PreparedStatement selectStmt = null;
  String query = null, stringDoc = null;
  ResultSet rs = null;
  int clientID = 1885;
		
  try{	
     // get a connection 
    Connection conn = Conn.getConn(); 
    
    // define, prepare, and execute the query
    // this will retrieve all XML data for a specific client 
    query = "select contactinfo from clients where id = " + clientID
    selectStmt = conn.prepareStatement(query);
    rs = selectStmt.executeQuery();

    // check for results 
    if (rs.next() == false) {
        System.out.println("Can't read document with id " + clientID);
    }

     // fetch XML data as a string and print the results 
    else {
         stringDoc = rs.getString(1);
         System.out.println(stringDoc);
      }
      . . . 
      conn.close(); 
    }
    catch (Exception e) { . . . }	    
}

Chương trình này in ra chỉ một hàng dữ liệu chứa tất cả các thông tin liên hệ XML của khách hàng cụ thể.

Mặc dù không được hiển thị ở đây, nhưng cũng có thể sử dụng XQuery để lấy toàn bộ một hoặc nhiều tài liệu XML, khi thực hiện bạn không cần kết hợp các dấu tham số trong XQuery của bạn. Phần sau trong bài viết này, bạn sẽ thấy một đoạn trích Java, sử dụng XQuery để lấy dữ liệu XML.

Lấy các phần của các tài liệu XML

Một nhiệm vụ lập trình phổ biến liên quan đến việc lấy ra các phần của các tài liệu XML. Mã Java trong ví dụ này lấy các tên và các địa chỉ email chính của các khách hàng có trạng thái "Bạc." Tên và thông tin trạng thái khách hàng được lưu trữ trong cột VARCHAR của SQL, trong khi các địa chỉ email được chứa trong các tài liệu XML trong cột "contactinfo".

Để cho ngắn gọn, tôi đã bỏ qua mã được hiển thị trước đây, chỉ bao gồm các dòng nào là mới hoặc khác trước thôi.

Liệt kê 9. Lấy các đoạn XML và dữ liệu quan hệ bằng SQL/XML
. . . 
String status = "Silver";
		
try{	
     // get a database connection
    . . . .
    // define, prepare, and execute a query that includes 
    // (1) a path expression that will return an XML element and  
    // (2) a parameter marker for a relational column value 
   String query = "SELECT name, xmlquery('$c/Client/email[1]' " + 
       " passing contactinfo as \"c\") " + 
       " from clients where status = ?";
   PreparedStatement selectStmt = conn.prepareStatement(query);
   selectStmt.setString(1, status);
   ResultSet rs = selectStmt.executeQuery();
   
   // iterate over and print the results 
   while(rs.next() ){
        System.out.println("Name: " + rs.getString(1) +
           "   Email:  " + rs.getString(2));
    }
    . . . 
   // release resources 
}  
catch (Exception e) { . . . }

Mã này đưa ra một câu lệnh SQL/XML gọi hàm XMLQuery. Nó cung cấp một biểu thức đường dẫn đến hàm này làm cho DB2 chuyển hướng đến phần tử "email" đầu tiên bên dưới phần tử "Client" gốc của các tài liệu XML đích. (Lưu ý rằng biểu thức đường dẫn phân biệt chữ hoa, chữ thường). Biến $c và mệnh đề FROM của SQL cho biết nơi có thể tìm thấy các tài liệu đích này -- trong cột "contactinfo" của bảng "clients". Mệnh đề WHERE của SQL giới hạn thêm các tài liệu XML đích theo các các tài liệu được tìm thấy chỉ trong các hàng có "trạng thái" khách hàng là một giá trị cụ thể (trong phương thức này là "Bạc").

Kết quả đầu ra trong chương trình này có thể xuất hiện tương tự như:

Liệt kê 10. Kết quả đầu ra từ ứng dụng trước
Name: Lisa Hansen   Email:  

Name: Amy Liu   Email:  <email>sailer555@yahoo.com</email>
. . . .

Trong kết quả đầu ra mẫu này, không có thông tin email nào được trả về cho một khách hàng có đủ điều kiện (Lisa Hansen) vì phần tử này không tồn tại trong tài liệu "contactinfo" XML của cô ấy.

Lọc vào các biến vị ngữ quan hệ và XML

Các chương trình Java cũng có thể ra lệnh cho DB2 lọc kết quả đầu ra truy vấn dựa trên các điều kiện áp dụng cho cả hai dữ liệu XML và dữ liệu không-XML. Ví dụ sau đây xây dựng trên một ví dụ trước, trả về các tên và các địa chỉ email chính của các khách hàng "Bạc" sống tại San Jose, California. Truy vấn đơn này đang chiếu dữ liệu từ các cột XML và không-XML cũng như đang giới hạn dữ liệu dựa trên các nội dung của cả hai cột XML và không-XML.

Đoạn trích dưới đây chỉ bao gồm các phần mã đã thay đổi từ ví dụ trước. Trong trường hợp này, bây giờ câu lệnh SELECT gọi XMLExists như một phần của mệnh đề WHERE để giới hạn các kết quả với các khách hàng sống trong thành phố và bang cụ thể (định nghĩa theo các biến tương ứng citystate).

Liệt kê 11. Lọc dữ liệu XML dựa trên các giá trị phần tử XML
. . . 
String status = "Silver";
String state = "CA";
String city = "San Jose";
. . . 	
try{	
    . . . .
   String query = "SELECT name, xmlquery('$c/Client/email[1]' " + 
       " passing contactinfo as \"c\") " + 
       " from clients where status = ?" 
       " and xmlexists('$c/Client/Address[state=$state][city=$city]' " +
       " passing contactinfo as \"c\", " + 
       " cast(? as char(2)) as \"state\", " + 
       " cast(? as varchar(30)) as \"city\" )";
   PreparedStatement selectStmt = conn.prepareStatement(query);
   selectStmt.setString(1, status);
   selectStmt.setString(2, state); 
   selectStmt.setString(3, city); 
   . . . 
}

Hầu hết truy vấn sẽ quen thuộc với bạn, vì vậy phần này chỉ tập trung vào bốn dòng cuối cùng của nó. Hàm XMLExists ra lệnh cho DB2 xác định xem một tài liệu XML cụ thể có chứa một địa chỉ khách hàng có thành phố và bang cụ thể không. Mệnh đề PASSING quy định có thể tìm các tài liệu XML ở đâu trong cột "contactinfo". Hàm CAST được gọi hai lần để gộp các giá trị của các tham số đầu vào (đối với thành phố và bang) với các kiểu dữ liệu phù hợp.

Kết quả đầu ra của chương trình này tương tự với kết quả trong Liệt kê 9, giả sử cả hai khách hàng Lisa Hansen và Amy Liu sống ở San Jose, California.

Sử dụng XQuery như là một ngôn ngữ cấp cao nhất

Mặc dù DB2 hỗ trợ đầy đủ cho XQuery như một ngôn ngữ cấp cao nhất, đặc tả XQuery ban đầu không xử lý các dấu tham số. Trong thực tế, điều này hạn chế việc sử dụng các XQuery trong các ứng dụng Java. Các phần trước đã minh họa cách bạn có thể nhúng XQueries trong SQL (ví dụ, khi sử dụng các hàm XMLQueryXMLExists để kết hợp các dấu tham số. Phần này tìm hiểu những gì bạn có thể làm với XQuery thuần túy trong các ứng dụng Java của bạn.

Ví dụ sau đây chứa một XQuery tương tự như một XQuery đã trình bày trong bài "Hãy khởi đầu nhanh chóng với DB2 9, Phần 4: Truy vấn dữ liệu DB2 XML bằng XQuery" (developerWorks, 04.2006). XQuery này xác định những khách hàng nào sinh sống tại San Jose, California. Đối với mỗi khách hàng như vậy, nó dựng lên một đoạn XML chứa một "emailList" bao gồm tất cả các địa chỉ email của khách hàng đó. Cuối cùng, nó trả về một chuỗi các emailList.

Liệt kê 12. Lấy các đoạn XML bằng XQuery
try{	
    // get a database connection 
    Connection conn = Conn.getConn();

   // define, prepare, and execute an XQuery (without SQL). 
   // note that we must hard-code query predicate values. 
   String query = "xquery for $y in db2-fn:xmlcolumn" + 
      "('CLIENTS.CONTACTINFO')/Client " +
      "where $y/Address/city=\"San Jose\" and $y/Address/state=\"CA\"  " +  
      "return <emailList> { $y/email } </emailList>";
    PreparedStatement selectStmt = conn.prepareStatement(query);
    ResultSet rs = selectStmt.executeQuery();
   
     // iterate over all items in the sequence and print results.
     while(rs.next() ){
         System.out.println(rs.getString(1)); 
      }

      // release all resources 
      . . .  
     // catch and handle any exceptions 
     . . . 
}

Cần chú ý đến hai khía cạnh của truy vấn này. Trước tiên, chuỗi truy vấn bắt đầu bằng từ khoá "xquery". Từ khóa này ra lệnh cho DB2 sử dụng trình phân tích cú pháp XQuery của nó để xử lý các truy vấn này. Bạn cần làm điều này bất cứ khi nào bạn sử dụng XQuery làm ngôn ngữ ngoài cùng. Thứ hai, truy vấn tham chiếu các tên bảng và cột chữ hoa. XQuery là một ngôn ngữ phân biệt chữ hoa, chữ thường. Do DB2 thường thêm chữ hoa vào các tên bảng và cột khi viết thông tin này vào danh mục nội bộ của nó, nên XQuery phải phù hợp với thông tin này.

Kết quả đầu ra mẫu trong chương trình này được thể hiện trong Liệt kê 13. Vì một mục "emailList" được trả về cho mỗi khách hàng có đủ điều kiện, nên một quá trình quét nhanh kết quả đầu ra này chỉ ra rằng bốn khách hàng có đủ điều kiện. Bản ghi đủ điều kiện đầu tiên chứa một địa chỉ email. Bản ghi đủ điều kiện thứ hai không chứa gì cả (có lẽ vì khách hàng chưa cung cấp thông tin này); kết quả là, emailList của nó là rỗng. Bản ghi đủ điều kiện thứ ba cho biết rằng có hai địa chỉ email trong bản ghi của khách hàng này. Bản ghi đủ điều kiện thứ tư chứa một địa chỉ email của khách hàng.

Liệt kê 13. Kết quả đầu ra mẫu từ ứng dụng trước
<emailList><email>newemail@someplace.com</email></emailList>

<emailList/>

<emailList><email>beatlesfan36@hotmail.com</email>
<email>lennonfan36@hotmail.com</email></emailList>

<emailList><email>sailer555@yahoo.com</email></emailList>

Bạn có thể muốn biết tại sao các tên của từng khách hàng đủ điều kiện không có trong kết quả của chúng ta. Câu trả lời rất đơn giản: XQuery làm việc với dữ liệu XML và các tên khách hàng được lưu trữ trong một cột VARCHAR của SQL. Vì vậy, nếu bạn muốn kết quả đầu ra bao gồm các tên của các khách hàng đủ điều kiện cũng như các địa chỉ email của họ, thì bạn sẽ phải viết một câu truy vấn bao gồm cả SQL lẫn XQuery.

Cập nhật và xóa dữ liệu XML

Để cập nhật và xóa dữ liệu XML được lưu trữ trong DB2, bạn sử dụng các câu lệnh SQL UPDATEDELETE. Các câu lệnh này có thể bao gồm các hàm SQL/XML giới hạn các hàng và các cột đích dựa trên các giá trị phần tử XML được lưu trữ trong các cột XML. Ví dụ, bạn có thể xoá các hàng chứa thông tin về các khách hàng sống trong vùng có mã vùng bưu điện cụ thể hoặc cập nhật dữ liệu XML (và dữ liệu XML) chỉ với các khách hàng sống trong một bang cụ thể.

Vì cú pháp để sử dụng các hàm SQL/XML trong các câu lệnh UPDATEDELETE có cùng cú pháp để sử dụng chúng trong các câu lệnh SELECT, nên sẽ không nhắc lại toàn bộ các mẫu mã ở đây. Thay vào đó, chỉ cần đưa ra các đoạn trích ngắn. Trước tiên, hãy xem xét các hoạt động DELETE.

Các ví dụ xóa

Xóa một hàng chứa dữ liệu XML là đơn giản. Chỉ cần sử dụng câu lệnh SQL DELETE với một mệnh đề WHERE (nếu muốn) để giới hạn các hàng được xóa. Ví dụ, đoạn mã sau xóa các hàng có mã định danh khách hàng là 1885:

Liệt kê 14. Xóa dữ liệu dựa trên một giá trị dữ liệu quan hệ
. . . 
 int clientID = 1885;
String query = "delete FROM clients WHERE id = ?";
 . . .  
PreparedStatement stmt = conn.prepareStatement(query);
stmt.setInt(1, clientID);
if (stmt.executeUpdate() == 0) {
   System.out.println("No records deleted.");
}
else { System.out.println("Record(s) deleted."); }
 . . .

Nếu bạn muốn giới hạn các hoạt động DELETE của bạn dựa trên các giá trị phần tử XML, thì chỉ cần gọi các hàm SQL/XML thích hợp trong mệnh đề WHERE của bạn. Liệt kê 14 sử dụng hàm XMLExists để xác định thông tin về tất cả các khách hàng sống ở Maine (viết tắt là "ME") cần xóa:

Liệt kê 15. Xóa dữ liệu dựa trên một giá trị phần tử XML
String state = "ME";
String query = "delete from clients " + 
" where xmlexists('$y/Client/Address[state=$state]' " +
" passing clients.contactinfo as \"y\", " + 
" cast(? as char(2)) as \"state\" )";
. . . 
PreparedStatement stmt = conn.prepareStatement(query);
stmt.setString(1, state);
. . .

Các ví dụ cập nhật

Với DB2 9, bạn có thể cập nhật dữ liệu trong một cột XML bằng cách sử dụng câu lệnh SQL UPDATE hoặc một thủ tục được lưu trữ, như là DB2XMLFUNCTIONS.XMLUPDATE. Trong cả hai trường hợp, cập nhật cột XML xảy ra ở một mức tài liệu chứ không phải ở một mức phần tử. Tuy nhiên, các lập trình viên, những người cập nhật bằng cách sử dụng các thủ tục đã lưu, không cần cung cấp toàn bộ tài liệu XML cho DB2. Họ chỉ cần quy định các phần tử XML được cập nhật và DB2 bảo toàn dữ liệu tài liệu không thay đổi cũng như cập nhật các phần tử đã quy định. Các lập trình viên ban hành các câu lệnh UPDATE cần quy định toàn bộ tài liệu (không chỉ các phần tử mà họ muốn thay đổi).

Tuy nhiên, một phần của bản phát hành DB2 9.5 đã đơn giản hóa rất nhiều việc cập nhật các tài liệu XML hiện có. Trong phiên bản này, chúng ta triển khai thực hiện một hàm XQuery mới gọi là "Transform" (Chuyển đổi). Hàm này mở rộng ngôn ngữ XQuery ban đầu vượt xa truy vấn XML đơn giản, để cập nhật XML.

Liệt kê 16 cập nhật thông tin liên hệ cho mã định danh khách hàng là 1333 bằng cách sử dụng dữ liệu XML chứa trong một tệp. Lưu ý rằng dữ liệu XML mới được xác nhận hợp lệ dựa vào một lược đồ đăng ký như là một phần của hoạt động cập nhật:

Liệt kê 16. Cập nhật dữ liệu XML từ một tệp
int clientID = 1333;
String fn = "c:/XMLFiles/Client1333.xml";  // input file
String query = "update clients set contactinfo = " +
  "xmlvalidate(? according to xmlschema id user1.mysample) " + 
  "where id = ?";
. . . 
PreparedStatement stmt = conn.prepareStatement(query);
stmt.setInt(2, clientID);
File file = new File(fn);
stmt.setBinaryStream(1, new FileInputStream(file), (int)file.length());
. . .

Tất nhiên, bạn cũng có thể sử dụng một biến vị ngữ truy vấn XML để quy định (các) bản ghi liên hệ khách hàng mà bạn muốn cập nhật. Một lần nữa, bạn cần sử dụng hàm SQL/XML để làm như vậy. Hãy tưởng tượng rằng một khách hàng muốn bạn để cập nhật số fax của mình nhưng không nhớ mã định danh khách hàng của mình. Thay vào đó, cô cung cấp số điện thoại nhà của mình để giúp chúng ta xác định vị trí thông tin của cô ấy. Đoạn trích mã sau đây sử dụng hàm XMLExists để giới hạn các cập nhật chỉ với bản ghi chứa số điện thoại nhà của cô ta. Lưu ý rằng toàn bộ thông tin liên hệ của khách hàng được cung cấp như là một chuỗi Java có chứa tài liệu XML đã chỉnh sửa. Đây là phương thức cần được tiếp tục với DB2 9.1. Tuy nhiên, với DB2 9.5, bạn vừa mới thêm một hàm W3C gọi là XML Transform hoặc Update. Hàm mới này, bây giờ đang trong trạng thái giới thiệu, cho phép bạn cập nhật một nút, xóa một nút, thay thế một nút hoặc sửa đổi một nút. Hàm chuyển đổi yêu cầu cú pháp cụ thể, được thể hiện trong Liệt kê 17b. Với hàm mới này, về cơ bản bạn đang chụp ảnh màn hình một tài liệu XML hiện có, thực hiện các thay đổi của mình rồi thay thế nó bằng những sửa đổi mới. Liệt kê 17b cho thấy sự khác biệt với phiên bản 9.5 và hàm chuyển đổi mới.

Liệt kê 17. Cập nhật dữ liệu XML với một chuỗi ký tự
String homeph = "4081114444";
String xml = 
   "<?xml version=\"1.0\"?>" +
   "<Client>" +
   "<Address> " +
      "<street>54 Moorpark Ave.</street>" +
      "<city>San Jose</city>" +
      "<state>CA</state>" +
      "<zip>95110</zip>" +
   "</Address>" +
   "<phone>" +
      "<work>4084630110</work>" +
      "<home>4081114444</home>" +
      "<cell>4082223333</cell>" +
   "</phone>" +
      "<fax>4087773111</fax>" +
   "<email>sailer555@yahoo.com</email>" +
   "</Client>";

String query =  "update clients set contactinfo = ?" + 
   "where xmlexists('$y/Client/phone[home=$homeph]' " +
   " passing clients.contactinfo as \"y\", " + 
   " cast(? as varchar(11)) as \"homeph\" )";
. . . 
PreparedStatement stmt = conn.prepareStatement(query);
stmt.setString(1, xml);
stmt.setString(2, homeph);
. . .
Liệt kê 17b. Cập nhật dữ liệu XML với một chuỗi ký tự với DB2 v9.5 và hàm chuyển đổi XQuery.
String homeph = "4081114444";
String xml =
         "4087773111";

String query =  "update clients  set contactinfo = " +
           "xmlquery('  "+
            "copy $new :=$CONTACTINFO" +
            "modify do replace value of $new/Client/fax with $p " +
            "return $new "+
             
         "passing cast (? as varchar(11)) as "p") "+
   "where xmlexists('$y/Client/phone[home=$homeph]') "  +
      "passing clients.contactinfo as \"y\"  ";

. . . 
PreparedStatement stmt = conn.prepareStatement(query);
stmt.setString(1, xml);
stmt.setString(2, homeph);
. . .

Trình xây dựng truy vấn

Nếu bạn cần trợ giúp viết các truy vấn cho các ứng dụng của mình, thì Developer Workbench (Bàn làm việc của nhà phát triển) cung cấp các trình thủ thuật tạo ra SQL/XML và các XQuery. Vì hầu hết các lập trình viên Java viết các ứng dụng đòi hỏi các dấu tham số, nên họ thường sử dụng SQL/XML. Phần này đi qua một ví dụ ngắn về cách sử dụng trình xây dựng truy vấn SQL để tạo ra một câu lệnh SQL/XML tương tự như một câu lệnh có trong Liệt kê 9.

Để tạo ra một câu lệnh SQL/XML, hãy thực hiện các bước sau:

  1. Chuẩn bị vùng làm việc của bạn.
  2. Quy định các đặc điểm truy vấn của bạn.
  3. Thực hiện truy vấn của bạn.

Hãy lần lượt đi dần qua từng bước.

Chuẩn bị vùng làm việc của bạn

Các câu lệnh SQL được tạo ra như một phần của "Dự án dữ liệu" có thể truy cập dữ liệu từ phối cảnh Data của bàn làm việc. Để tạo một dự án, hoàn thành các bước sau:

  1. Mở phối cảnh Data. Chọn Window > Open Perspective > Other > Data.
  2. Tạo một kết nối đến cơ sở dữ liệu đích của bạn. Nhấn chuột phải trong ô Database Explorer (Trình thám hiểm cơ sở dữ liệu) ở góc dưới bên trái. Chọn New Connection (Kết nối mới) và ghi rõ tên cơ sở dữ liệu , tên người dùng và mật khẩu của bạn.
  3. Tạo một dự án dữ liệu mới. Nhấn chuột phải trong ô Data Project Explorer ((Trình thám hiểm dự án dữ liệu) ở góc trên bên trái. Chọn New > Project > Data > Data Development Project. Khi được nhắc, hãy cung cấp cho dự án một tên bạn đã chọn và liên kết nó với kết nối cơ sở dữ liệu bạn tạo ra trước đó.

Với việc mở kết nối cơ sở dữ liệu và tạo một dự án dữ liệu, bạn đã sẵn sàng để xây dựng các truy vấn.

Xây dựng truy vấn của bạn

Để giữ cho hướng dẫn này đơn giản, hãy tạo một câu lệnh SQL/XML trả về địa chỉ email chính của các khách hàng có một trạng thái cụ thể. Truy vấn sẽ tương tự như sau:

Liệt kê 18. Truy vấn SQL/XML mẫu
SELECT name, xmlquery('$c/Client/email[1]'  
passing contactinfo as "c")   
from clients where status = ?

Làm theo các bước sau để tạo truy vấn của bạn:

  1. Khởi chạy SQL Builder. Trong dự án dữ liệu của bạn, đánh dấu chọn thư mục SQL Scripts và nhấn chuột phải. Chọn New > SQL Statement. Khi được nhắc, hãy chấp giá trị mặc định cho tên dự án của bạn và chỉ rõ tên cho câu lệnh SQL của bạn. Chấp nhận giá trị mặc định cho kiểu câu lệnh (SELECT) và chọn sử dụng SQL builder (Trình xây dựng SQL). Nhấn Finish.
  2. Chỉ định bảng được truy vấn. Nhấn chuột phải vào ô trung tâm và chọn Add Table (Thêm bảng). Mở rộng thư mục lược đồ của bạn và chọn bảng "clients".
  3. Chỉ rõ các cột cần quan tâm. Đối với ví dụ này, bạn cần có một cột và kết quả đầu ra của một hàm (XMLQuery) trong tập kết quả. Để thực hiện, hãy hoàn thành các bước sau:
    1. Kiểm tra cột "names" được hiển thị trong ô trung tâm.
    2. Nhấn chuột vào dòng đầu tiên được hiển thị trong thẻ Column bên dưới ô trung tâm. Nhấn vào góc xa bên phải của ô này để hiển thị một phím mũi tên và chọn Build Expression (Xây dựng biểu thức). Nhấn Enter.
    3. Chọn Function từ trình đơn đã hiển thị.
    4. Chọn XML làm thể loại hàm và XMLQuery là hàm. Bên cạnh giá trị tham số 1, nhấn vào mũi tên trong ô Value (Giá trị) và chọn Edit Expression (Chỉnh sửa biểu thức).
    5. Chỉ rõ biểu thức đường dẫn phù hợp trong: $c/Client/email[1], và nhấn Finish hai lần.
    6. Thay đổi câu lệnh SQL được tạo để có một mệnh đề PASSING trong hàm XQuery. Hàm XQuery cuối cùng sẽ đọc: '$c/Client/email[1]' passing contactinfo as "c"
  4. Chỉ rõ biến vị ngữ truy vấn (mệnh đề WHERE). Với ví dụ này, bạn cần thêm một biến vị ngữ truy vấn cho một cột quan hệ.
    1. Trong thẻ Conditions (Các điều kiện) bên dưới câu lệnh SQL/XML của bạn, nhấn vào hàng đầu tiên được hiển thị trong thẻ Column. Nhấn chuột vào phím mũi tên ở xa bên phải của ô này và chọn cột status (trạng thái).
    2. Nhấn vào ô Operator (Toán tử) và chọn toán tử đẳng thức ("=").
    3. Nhấn chuột vào phím mũi tên ở góc xa bên phải của ô Value và chọn Build Expression. Nhấn Enter.
    4. Chọn Constant (Hằng số) và sau đó là String Constant khi được nhắc.
    5. Chỉ rõ một tên biến máy chủ cho đầu vào của người dùng (ví dụ như "status"). Nhấn Finish.

Thực hiện truy vấn của bạn

Sau khi xây dựng truy vấn của mình, bạn đã sẵn sàng để chạy nó.

  1. Xác định vị trí truy vấn trong dự án Dữ liệu của bạn, nhấn chuột phải và chọn Run SQL (Chạy SQL).
  2. Khi được nhắc, chỉ rõ một giá trị đầu vào cho trạng thái khách hàng (ví dụ như "Vàng" hay "Bạc") và nhấn OK.
  3. Xem lại các kết quả trong ô Data Output (Đầu ra dữ liệu).

Các thủ tục đã lưu

Trong các môi trường được nối mạng, các thủ tục được lưu trữ thường làm giảm giao tiếp cần thiết giữa các ứng dụng máy khách và DB2. Tất nhiên, điều này cải thiện hiệu năng thời gian chạy. Với DB2 9, các thủ tục được lưu trữ có thể bao gồm các tham số và các biến XML.

Trong khi việc thảo luận phát triển thủ tục được lưu trữ chi tiết nằm ngoài phạm vi của bài viết này, tác giả đã đưa ra xem xét lại một kịch bản đơn giản để bạn có thể thấy một thủ tục được lưu trữ của DB2 có thể được viết như thế nào để lấy các phần của các tài liệu XML. Kịch bản này sử dụng các trình thủ thuật trong Data Studio để tạo, triển khai và chạy mã thủ tục được lưu trữ SQL cần thiết. Nếu muốn, bạn có thể phát triển và triển khai một thủ tục được lưu trữ SQL tương đương khi sử dụng bộ xử lý dòng lệnh DB2. Ngoài ra, bạn có thể viết các thủ tục được lưu trữ dựa trên XML bằng Java.

Với ví dụ này, bạn sẽ viết một thủ tục được lưu để lấy các tên và các địa chỉ email chính của các khách hàng có một trạng thái cụ thể, cũng giống như bạn đã làm ở trên. Mặc dù thủ tục này khá đơn giản, nó sẽ giúp bạn hiểu cách tạo ra các thủ tục dựa trên SQL truy vấn và trả về dữ liệu XML bằng các trình thủ thuật có sẵn.

Để tạo thủ tục này, hãy thực hiện một vài bước đơn giản:

  1. Chuẩn bị vùng làm việc của bạn.
  2. Quy định các nội dung về thủ tục của bạn.
  3. Triển khai và thử nghiệm thủ tục của bạn.

Hãy lần lượt đi dần qua từng bước này.

Chuẩn bị vùng làm việc của bạn

Thủ tục được lưu trữ được định nghĩa như là một phần của một dự án Dữ liệu. Nếu bạn vẫn chưa làm như vậy, hãy mở phối cảnh Dữ liệu, thiết lập một kết nối cơ sở dữ liệu và tạo một dự án Dữ liệu. Để biết chi tiết, hãy xem phần Chuẩn bị vùng làm việc của bạn ở trên.

Tạo thủ tục của bạn

Thủ tục được lưu trữ dựa trên SQL của chúng ta gọi một câu lệnh SQL/XML đơn để truy vấn bảng "clients" dựa vào đầu vào từ người gọi. Thủ tục này trả về một tập kết quả duy nhất chứa một cột SQL VARCHAR (có tên của khách hàng) và cột một XML (có email của khách hàng). Truy vấn này sẽ tương tự như sau:

Liệt kê 19. Truy vấn SQL/XML mẫu
SELECT name, xmlquery('$c/Client/email[1]'  
passing contactinfo as "c")   
from clients where status = ?

Quá trình xây dựng một thủ tục được lưu trữ SQL để truy cập dữ liệu XML không khác so với xây dựng một thủ tục SQL để truy cập dữ liệu không-XML. Dưới đây là một cách làm điều này:

  1. Định một nghĩa thủ tục được lưu trữ mới. Mở rộng dự án Dữ liệu mới của bạn, chọn Stored Procedures (Các thủ tục được lưu trữ) và nhấn chuột phải. Chọn New > Stored Procedure. Làm theo các lời nhắc để kiểm tra tên dự án và chỉ rõ một tên thủ tục được lưu trữ. Duy trì kiểu ngôn ngữ mặc định là SQL.
  2. Chỉ rõ (các) câu lệnh SQL của bạn. Khi được nhắc, bạn có thể gõ trực tiếp vào câu lệnh truy vấn của bạn hoặc sử dụng các trình thủ thuật để giúp bạn tạo ra một câu lệnh. Các bước sau đây dành cho cái sau.
    1. Nhấn Create SQL.
    2. Chấp nhận các giá trị mặc định cho kiểu câu lệnh (SELECT) và quá trình phát triển (được hướng dẫn thông qua việc tạo câu lệnh bằng các trình thủ thuật).
    3. Chọn bảng clients làm đích cho câu lệnh của bạn.
    4. Trong thẻ Columns, có hai cột trong tập kết quả cuối cùng. Chọn names, rồi chọn Add > Function > Next. Trong cửa sổ tiếp theo, chỉ rõ thể loại hàm như là XML và XMLQuery là chữ ký hàm. Nhấn Finish.
    5. Trong thẻ Conditions, dựng mệnh đề SQL WHERE. Chỉ rõ clients.status làm cột, các dấu bằng ("=") làm toán tử và :input làm giá trị.
    6. Sửa đổi câu lệnh SQL kết quả để bao gồm biểu thức đường dẫn thích hợp để lấy địa chỉ email đầu tiên trong cột "contactinfo". Cụ thể, thay đổi dòng XMLQUERY để đọc: xmlquery('$c/Client/email[1]' passing contactinfo as "c")
    7. Phân tích cú pháp truy vấn của bạn để kiểm tra xem có các lỗi cú pháp nào không.
  3. Chỉ rõ thông tin triển khai. Cụ thể là, bạn có thể tìm thấy nó có ích với Enable Debugging (Cho phép gỡ lỗi).
  4. Theo tùy chọn, hãy xem lại mã SQL được tạo ra. Nhấn Show SQL. (Xem Liệt kê 20 để biết mẫu nào sẽ xuất hiện).
  5. Hoàn tất thủ tục được lưu trữ. Nhấn Finish.
Liệt kê 20. Mã mẫu được tạo ra cho thủ tục được lưu trữ SQL liên quan đến dữ liệu XML
CREATE PROCEDURE foo (INPUT VARCHAR(10)
	DYNAMIC RESULT SETS 1
--------------------------------------------
--SQL Stored Procedure
	--INPUT
--------------------------------------------
P1:BEGIN
	--------------------------------------------
	--Variables declaration fragment inserted from SP_SQL_VAR.FRAGMENT
	--------------------------------------------

	--Declare cursor
	DECLARE cursor1 CURSOR WITH RETURN FOR
		SELECT NAME, XMLQUERY('$c/Client/email[1]' PASSING CONTACTINFO AS "c")
		 FROM CLIENTS
		 WHERE STATUS=INPUT;

	--Cursor left open for client application
	OPEN cursor1;
END P1

Triển khai và thử nghiệm thủ tục của bạn

Với thủ tục của bạn đã tạo ra, bây giờ bạn đã sẵn sàng để triển khai và thử nghiệm nó. Hãy làm theo các bước sau:

  1. Triển khai thủ tục. Xác định vị trí thủ tục trong dự án dữ liệu của bạn, nhấn chuột phải và chọn Deploy (triển khai). Chấp nhận các giá trị mặc định và nhấn Finish. Ô Data Output ở góc dưới bên phải sẽ lưu ý rằng thủ tục của bạn đã được triển khai thành công
  2. Chạy thủ tục. Xác định vị trí thủ tục trong dự án dữ liệu của bạn, nhấn chuột phải và chọn Run. Khi được nhắc, chỉ rõ một giá trị đầu vào cho trạng thái khách hàng (ví dụ như "Vàng" hay "Bạc"). Nhấn OK, và xem các kết quả của thủ tục được lưu trữ của bạn trong ô Data Output.

Bạn có thể gọi thủ tục được lưu trữ bên ngoài Bàn làm việc của nhà phát triển, nếu muốn. Ví dụ, nếu bạn đã đặt tên cho thủ tục của bạn là "getInfo" (nhận thông tin), thì bạn có thể gọi bộ xử lý dòng lệnh DB2, kết nối với cơ sở dữ liệu và ban hành câu lệnh này:

Liệt kê 21. Gọi thủ tục được lưu trữ của bạn
call getInfo('Silver')

Tóm tắt

Viết các ứng dụng Java làm việc với dữ liệu XML của DB2 liên quan đến cách sử dụng mã JDBC quen thuộc để thực hiện các truy vấn và xử lý kết quả của chúng. IBM cung cấp các công cụ như Data Studio, một bàn làm việc của nhà phát triển dựa trên Eclipse, để giúp bạn mã hóa, thử nghiệm và gỡ lỗi công việc của mình. Đi kèm với Data Studio là các trình thủ thuật để tìm hiểu các nội dung cơ sở dữ liệu của bạn, viết các thủ tục được lưu trữ để truy cập dữ liệu XML và không-XML, viết các XQuery để truy cập dữ liệu XML và viết các câu lệnh SQL/XML để truy cập dữ liệu XML và không-XML.

Lời cảm ơn

Nhờ Don Chamberlin, Grant Hutchison, và Brian Payton về việc xem lại bài viết này.

Tài nguyên

Học tập

Lấy sản phẩm và công nghệ

  • Xây dựng dự án phát triển tiếp theo của bạn bằng phần mềm dùng thử của IBM, có sẵn để tải trực tiếp từ developerWorks.
  • Bây giờ bạn có thể sử dụng DB2 miễn phí. Hãy tải về DB2 Express-C, một phiên bản miễn phí của Ấn bản DB2 Express cho cộng đồng, cung cấp các tính năng dữ liệu cốt lõi giống như Ấn bản DB2 Express và cung cấp một cơ sở vững chắc để xây dựng và triển khai các ứng dụng.

Thảo luận

Bình luận

developerWorks: Đăng nhập

Các trường được đánh dấu hoa thị là bắt buộc (*).


Bạn cần một ID của IBM?
Bạn quên định danh?


Bạn quên mật khẩu?
Đổi mật khẩu

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Ở lần bạn đăng nhập đầu tiên vào trang developerWorks, một hồ sơ cá nhân của bạn được tạo ra. Thông tin trong bản hồ sơ này (tên bạn, nước/vùng lãnh thổ, và tên cơ quan) sẽ được trưng ra cho mọi người và sẽ đi cùng các nội dung mà bạn đăng, trừ khi bạn chọn việc ẩn tên cơ quan của bạn. Bạn có thể cập nhật tài khoản trên trang IBM bất cứ khi nào.

Thông tin gửi đi được đảm bảo an toàn.

Chọn tên hiển thị của bạn



Lần đầu tiên bạn đăng nhập vào trang developerWorks, một bản trích ngang được tạo ra cho bạn, bạn cần phải chọn một tên để hiển thị. Tên hiển thị của bạn sẽ đi kèm theo các nội dung mà bạn đăng tải trên developerWorks.

Tên hiển thị cần có từ 3 đến 30 ký tự. Tên xuất hiện của bạn phải là duy nhất trên trang Cộng đồng developerWorks và vì lí do an ninh nó không phải là địa chỉ email của bạn.

Các trường được đánh dấu hoa thị là bắt buộc (*).

(Tên hiển thị cần có từ 3 đến 30 ký tự)

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Thông tin gửi đi được đảm bảo an toàn.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=70
Zone=Information Management, Công nghệ Java
ArticleID=751760
ArticleTitle=Hãy khởi đầu nhanh chóng với DB2 9 pureXML, Phần 5: Phát triển các ứng dụng Java với dữ liệu XML của DB2
publish-date=03252010