Chuẩn bị cho kỳ thi 733 về Phát triển ứng dụng DB2 9, Phần 3: Thao tác dữ liệu XML

Lưu trữ và lấy ra dữ liệu XML thông qua ứng dụng của bạn

Tìm hiểu DB2® của IBM® phân tích cú pháp XML, xử lý khoảng trống và tuần tự hóa XML như thế nào và xem xét cách mã hóa tài liệu và kiểu dữ liệu phía khách ảnh hưởng đến việc phân tích cú pháp và tuần tự hóa ra sao. Cũng tìm hiểu cách DB2 xác nhận hợp lệ tài liệu XML dựa vào một lược đồ XML như thế nào cũng như làm thế nào để sử dụng các hàm SQL/XML để "băm nhỏ" XML thành dữ liệu quan hệ, lắp ráp ngược lại dữ liệu quan hệ thành XML và xuất bản dữ liệu XML như là dữ liệu quan hệ.

Donald E. Payne, Chuyên gia tư vấn IT, IBM

Donald Payne là một Chuyên gia tư vấn CNTT với IBM. Ông đã tư vấn cho các khách hàng và dạy các lớp chuyên ngành máy tính về cơ sở dữ liệu quan hệ và khả năng mở rộng. Ông đã làm việc với XML đầu tiên vào năm 2001. Ông đã hỗ trợ sớm cho các khách hàng sử dụng các đặc tính pureXML của DB2 V9.



13 10 2009

Trước khi bạn bắt đầu

Về loạt hướng dẫn này

Chứng chỉ Nhà phát triển ứng dụng được IBM công nhận xác nhận với những người khác rằng bạn là một nhà phát triển ứng dụng mức trung cấp hoặc cao cấp về IBM DB2® dành cho Linux®, UNIX® và Windows® và chỉ ra rằng bạn có các kỹ năng giỏi trong tất cả các nhiệm vụ lập trình chung cũng như lập trình SQL nhúng, lập trình ODBC/CLI, lập trình .NET hoặc lập trình Java ™.

Loạt bài viết gồm chín hướng dẫn miễn phí này được thiết kế để trợ giúp cho bạn chuẩn bị cho kỳ thi lấy chứng chỉ Nhà phát triển ứng dụng DB2 9 dành cho Linux, UNIX và Windows (kỳ thi 733). Mỗi hướng dẫn bao gồm một liên kết đến một bản tải về dùng thử miễn phí DB2 9 cho Linux, UNIX và Windows. Các hướng dẫn này cung cấp một cơ sở chắc chắn cho mỗi phần của kỳ thi. Tuy nhiên, bạn không nên chỉ dựa vào các hướng dẫn này như là sự chuẩn bị duy nhất cho kỳ thi của bạn.

Hướng dẫn này nói về cái gì?

Hướng dẫn này dạy cho bạn về cách DB2 và ứng dụng khách DB2 thao tác dữ liệu XML như thế nào. Bạn sẽ tìm hiểu:

  • DB2 xử lý khoảng trống ở đầu vào như thế nào.
  • DB2 xác định bảng mã của một tài liệu XML ở đầu vào và đầu ra như thế nào.
  • DB2 có thể xác nhận tính hợp lệ XML ở đầu vào như thế nào.
  • Làm thế nào để thi hành một truy vấn XQuery hay XPath và nhận biết các kết quả của nó.
  • Làm thế nào để phân rã hoặc băm nhỏ, đầu vào XML thành các hàng trong bảng quan hệ.
  • Làm thế nào để xuất bản các dữ liệu quan hệ dưới dạng XML.
  • Làm thế nào để xuất bản các dữ liệu XML như là các dữ liệu quan hệ.

Đây là bài thứ ba trong một loạt bài viết gồm chín hướng dẫn được thiết kế để giúp bạn chuẩn bị cho kỳ thi lấy chứng chỉ Nhà phát triển ứng dụng DB2 9 (kỳ thi 733). Tài liệu hướng dẫn này trình bày các mục tiêu trong Phần 3 của kỳ thi, mang tên "Thao tác dữ liệu XML".

Các mục tiêu

Sau khi hoàn thành hướng dẫn này, bạn sẽ có khả năng viết các ứng dụng để lưu trữ và lấy ra dữ liệu XML.

Các điều kiện cần trước

Hướng dẫn này được viết cho các nhà phát triển DB2, những người đã quen thuộc với các khái niệm sau:

  • XML, bao gồm:
    • Các phần tử.
    • Các thuộc tính.
    • Các tài liệu.
    • Các tài liệu đúng ngữ pháp và cú pháp.
    • Các khai báo XML.
    • Các vùng tên.
  • XPath, bao gồm mô hình dữ liệu XML (XDM - XML Data Model):
    • Các nút.
    • Các giá trị nguyên tử.
    • Các mục.
    • Các chuỗi.
    • Trục: Cha mẹ, con cái, cháu chắt và v.v.
    • Các bước.
    • Các ký tự đại diện.
    • Các vị từ
  • XQuery:
    • Các hàm db2-fn xmlcolumn(), sqlquery().
    • Biểu thức FLWOR: for, let, where, order by, return.
    • Đoạn mào đầu.
  • Lược đồ XML, xác nhận hợp lệ và các vùng tên.
  • Các khái niệm về mã hóa ký tự và mã Unicode.

Đối với các ví dụ mã, bạn cần quen với

  • Ngôn ngữ lập trình.
  • Bất cứ giao diện hay các thư viện nào được sử dụng, ví dụ như CLI và JDBC.
  • Các kiểu dữ liệu mà ngôn ngữ lập trình đó hỗ trợ và chúng ánh xạ tương ứng tới các kiểu.

Xem phần Tài nguyên để tìm các đường liên kết đến những thông tin này.

Các yêu cầu hệ thống

Để hoàn thành hướng dẫn này, bạn cần những điều sau đây:

  • Một máy tính chạy Linux, UNIX hoặc Windows, đã cài đặt FixPack 1 DB2 9.
  • Một trình soạn thảo, ví dụ như Rational Application Developer (Nhà phát triển ứng dụng Rational), Windows Notepad hoặc vi (xem Tài nguyên về hướng dẫn này để biết thêm thông tin).
  • Một trình biên dịch để chạy các ví dụ mã. Trang Trung tâm thông tin DB2 về các ngôn ngữ lập trình và các trình biên dịch được hỗ trợ để phát triển ứng dụng cơ sở dữ liệu liên kết tới các trang liệt kê các trình biên dịch được hỗ trợ trong tất cả các ngôn ngữ được hỗ trợ:
    • Các trình biên dịch C được hỗ trợ: Xem phần Tài nguyên, mục "Nhận sản phẩm và các công nghệ".
    • Đối với ngôn ngữ Java, DB2 trên Windows đi kèm với một SDK Java 2, phiên bản 5, bao gồm trình biên dịch javac và môi trường thời gian chạy (JRE), dưới thư mục SQLLIB\java\jdk. (Trên hầu hết các nền tảng, DB2 9 hỗ trợ Java 2 SDK, phiên bản 1.4.2 đến 5. Xem thông tin trực tuyến DB2, "Supported Java application development software," để biết thêm chi tiết). Các JDK bao gồm JRE trong thư mục SQLLIB\java\jdk\jre. Biến môi trường PATH của bạn cần phải bao gồm các thư mục bin trong thư mục jdk; CLASSPATH cần phải bao gồm một số các tệp tin JAR và ZIP dưới thư mục SQLLIB\java.
  • Cần một trình duyệt Web để tiện xem một tệp tin XML, kiểm tra xem nó có đúng khuôn dạng không và tìm ra các lỗi.

Chạy các ví dụ

Nếu bạn chạy các ví dụ SQL từ hướng dẫn này trong trình xử lý dòng lệnh (CLP) DB2 db2, hãy xem phần có tên "DB2 Command Line Processor (CLP) behavior and options".


Xử lý khoảng trống trong việc phân tích cú pháp và xác nhận hợp lệ XML

XML thay đổi theo việc phân tích cú pháp (đầu vào)

Khi DB2 hoặc một trình xử lý XML khác phân tích cú pháp XML đầu vào -- có nghĩa là, chuyển đổi nó từ các ký tự thành một cấu trúc nội tại -- nó tạo ra một số thay đổi với XML trong quá trình xử lý, như tiêu chuẩn XML đã định rõ. Một số thay đổi này là quan trọng nếu bạn quan tâm đến các yêu cầu lưu trữ hoặc các yêu cầu về bộ nhớ của XML trong DB2 hoặc trong ứng dụng khách. Nó cũng có thể quan trọng nếu bạn quan tâm đến các nút văn bản chỉ chứa khoảng trống, vẻ ngoài của XML khi lấy ra và tuần tự hóa trở lại thành các ký tự hoặc các chữ ký số.

Trình phân tích cú pháp (parser) xử lý đầu vào XML như sau:

  1. Trình phân tích cú pháp sẽ xác định bảng mã. Nếu bảng mã của mã nguồn không tương đương với bảng mã bên trong DB2 là UTF-8, thì các ký tự mã nguồn được chuyển mã, hoặc được chuyển đổi từ bảng mã nguồn thành bảng mã của DB2. Xem phần "Mã hóa XML", mục "Bảng mã nào?" để biết thêm thông tin.
  2. Các ký tự hết dòng là carriage return (CR, hex code 0xD) và sang dòng line feed (LF, hex code 0xA). Các hệ điều hành khác nhau (DOS/Windows, UNIX/Linux, Mac OS hay OS X) tuân theo các quy ước khác nhau để kết thúc các dòng. Các ký tự này được tiêu chuẩn hóa, hay là chuyển đổi thành chỉ một dạng, LF hoặc 0xA.
  3. Trình phân tích cú pháp kiểm tra một tài liệu đúng ngữ pháp và cú pháp.
  4. Các thực thể XML bao gồm các thực thể đã định nghĩa sẵn như &" và các thực thể được định nghĩa trong một DTD. Các tham chiếu thực thể trong tài liệu được khai triển hoặc được chuyển đổi thành giá trị của thực thể. (Các mã ký tự đã khai triển của các thực thể đã định nghĩa sẵn là nhỏ hơn thực thể hay tham chiếu ban đầu). Bất kỳ DTD nội tại nào sẽ được loại bỏ.
  5. Khoảng trống là một thuật ngữ tóm bắt mọi (catch-all) ký tự không được in ra, thường là:
    • dấu cách (mã hex là 0x20).
    • dấu tab (mã hex 0x9).
    • Các ký tự hết dòng (như nói trên).

    Khoảng trống ranh giới có thể được loại bỏ dựa trên các quy tắc mà bạn sẽ đọc trong phần "Phân tích cú pháp và khoảng trống ranh giới" dưới đây.

  6. Các tham chiếu ký tự XML chẳng hạn như € (€, biểu tượng đồng euro) được khai triển hoặc chuyển đổi thành mã ký tự thực tế trong UTF-8. Giống như với các tham chiếu thực thể đã định nghĩa sẵn, các mã ký tự đã khai triển thường nhỏ hơn các tham chiếu ban đầu.
  7. Khi xác nhận hợp lệ, khoảng trống có thể bỏ qua sẽ được loại bỏ. Xem phần "Xác nhận hợp lệ và khoảng trống có thể bỏ qua" dưới đây để biết thêm thông tin.

Các chú thích XML (<!-- comment -->) không được loại bỏ.

Xem phần Tải về để tìm các mã mẫu giải thích việc phân tích cú pháp và xác nhận hợp lệ thay đổi khoảng trống như thế nào.

Lời khuyên: Các tùy chọn -n-q của CLP DB2 có thể ảnh hưởng đến khoảng trống trong chuỗi ký tự bằng chữ trước khi chúng đi tới DB2. Xem phần "DB2 Command Line Processor (CLP) behavior and options" (Hành vi và các tùy chọn của trình xử lý dòng lệnh DB2) để biết thêm thông tin.

Phân tích cú pháp và khoảng trống ranh giới

Khi bạn tạo ra XML, nó thường bao gồm thêm khoảng trống ranh giới để làm cho nó "đẹp" và dễ đọc hơn. Khoảng trống ranh giới trong một tài liệu XML là văn bản chỉ chứa các khoảng trống tại ranh giới giữa hai thẻ XML, mà không có ký tự không phải khoảng trống nào khác.

Liệt kê1. Tài liệu XML mẫu với việc xử lý khoảng trống
<customerinfo xmlns="http://posample.org" Cid='  1018  ' >
    <name>     </name>
    <addr country="  Canada
    ca  " xml:space="preserve">
        <street>     </street>
        <city>     </city>
        <prov-state>     </prov-state>
        <pcode-zip>     </pcode-zip>
    </addr>
    <phone type="   ">  416-555-1358  </phone>
</customerinfo>

Trong liệt kê 1, có khoảng trống ranh giới giữa mỗi thẻ và thẻ tiếp theo. Ví dụ, có khoảng trống:

  • Giữa thẻ bắt đầu <customerinfo Cid=' 1018 '> và thẻ bắt đầu <name>
  • Giữa thẻ bắt đầu </name> và thẻ kết thúc </name>
  • Giữa thẻ kết thúc </phone> và thẻ kết thúc </customerinfo>

Nếu việc phân tích cú pháp không bỏ đi khoảng trống này, một tài liệu "đẹp" đã phân tích xong sẽ có nhiều phần tử có nội dung hỗn hợp -- một sự hỗn hợp của các phần tử con và các nút văn bản -- và nhiều nút văn bản không có gì khác ngoài những khoảng trống.

Một giá trị thuộc tính không phải là khoảng trống ranh giới, thậm chí nếu tất cả nó chỉ là các khoảng trống, như được gõ vào. Trong Liệt kê 1, khoảng trống xung quanh con số 1018, các từ "Canada ca" và số điện thoại "516-555-1358" có thể là các dữ liệu không đúng dạng, nhưng nó không phải là khoảng trống ranh giới.

Dưới đây là các quy tắc để loại bỏ hoặc giữ lại khoảng trống ranh giới, theo thứ tự ưu tiên giảm dần:

  1. Nếu XML chứa một phần tử với thuộc tính xml:space="preserve", thì trình phân tích cú pháp sẽ giữ lại các khoảng trống ranh giới trong phần tử đó và mọi phần tử con.
  2. Nếu bạn chèn XML với một hàm tường minh XMLPARSE() và chỉ rõ hoặc tùy chọn PRESERVE WHITESPACE hoặc tùy chọn STRIP WHITESPACE, thì trình phân tích cú pháp sẽ giữ lại hoặc loại bỏ khoảng trống ranh giới như được chỉ thị.
  3. Nếu bạn chèn XML với hàm tường minh XMLPARSE() và không chỉ rõ hoặc tùy chọn PRESERVE WHITESPACE hoặc tùy chọn STRIP WHITESPACE, thì khoảng trống ranh giới sẽ bị loại bỏ, vì đó là mặc định cho hàm XMLPARSE()
  4. Việc phân tích cú pháp sẽ ngầm xảy ra khi bạn chèn XML như là một chuỗi ký tự bằng chữ, biến chủ hoặc cái đánh dấu tham số (parameter marker) mà không có hàm XMLPARSE() hoặc XMLVALIDATE(). (XMLVALIDATE() thực hiện việc phân tích cú pháp để xác nhận hợp lệ, là tường minh thực sự và bỏ qua quy tắc này). Trong việc phân tích cú pháp ngầm ẩn trong một ứng dụng CLI:
    • Bạn có thể dùng lệnh SET CURRENT IMPLICIT XMLPARSE OPTION = 'value' trong phiên làm việc của bạn, ở đây value sẽ nhận giá trị hoặc là PRESERVE WHITESPACE hoặc STRIP WHITESPACE. Nếu bạn làm thế, thì trình phân tích cú pháp sẽ giữ lại hay loại bỏ khoảng trống ranh giới tuân theo chỉ thị.
    • Nếu không, khi bạn sửa đổi tệp tin db2cli.ini của bạn để bao gồm thêm dòng.

      CurrentImplicitXMLParseOption="parse-option"

      vào trong một [section] được đặt tên theo tên cơ sở dữ liệu của bạn ([database-name]), thì trình phân tích cú pháp sẽ giữ lại hay loại bỏ khoảng trống ranh giới cho cơ sở dữ liệu này tuân theo chỉ thị. Tham số parse-option sẽ hoặc là PRESERVE WHITESPACE hoặc STRIP WHITESPACE. Ví dụ:

      [sample]
      CurrentImplicitXMLParseOption="PRESERVE WHITESPACE"

      Tệp tin db2cli.ini nằm trong %DBPATH%. Tên của section, tên của tham số và giá trị của nó không phân biệt chữ hoa, chữ thường. Bạn có thể thêm mục này hoặc bằng cách soạn thảo trực tiếp tệp tin, hoặc bằng câu lệnh DB2:

      UPDATE CLI CONFIGURATION FOR SECTION section-name
      USING CurrentImplicitXMLParseOption '"parse-option"';
  5. Trình phân tích cú pháp loại bỏ khoảng trống ranh giới.
Liệt kê 2. Ví dụ về Quy tắc 5: Chèn XML với phần tử rỗng, phân tích cú pháp ngầm ẩn, loại bỏ khoảng trống
connect to sample
insert into catalog values ('emptyelement', '<a> </a>')
DB20000I  The SQL command completed successfully.

select catlog from catalog where name = 'emptyelement'
<a/>
Liệt kê 3. Ví dụ về Quy tắc 2: Chèn XML với phần tử rỗng, phân tích cú pháp tường minh, giữ lại khoảng trống ranh giới
insert into catalog values ('preservespace', xmlparse(document '<a>  </a>' 
preserve whitespace))
DB20000I  The SQL command completed successfully.

xquery db2-fn:sqlquery('select catlog from catalog where 
name = ''preservespace'' ')/a
<a>  </a>

Xác nhận hợp lệ và khoảng trống có thể bỏ qua

Khi bạn nhập vào XML bằng hàm XMLVALIDATE(), DB2 phân tích cú pháp tài liệu, sau đó xác nhận tính hợp lệ tài liệu đã phân tích dựa vào một Định nghĩa Lược đồ XML (XSD - XML Schema Definition). (Trong một số trường hợp, DB2 có thể phân tích cú pháp và xác nhận tính hợp lệ chỉ trong một bước với một trình phân tích cú pháp xác nhận hợp lệ thay cho trình phân tích cú pháp mặc định không xác nhận hợp lệ. Nhưng việc xử lý được mô tả trong "Phân tích cú pháp và khoảng trống ranh giới" vẫn xảy ra trước tiên). Việc xác nhận hợp lệ luôn luôn loại bỏ khoảng trống có thể bỏ đi được, đó là khoảng trống đáp ứng một trong các tiêu chuẩn sau đây:

  • Một kiểu phức hợp chỉ gồm phần tử là một phần tử được định nghĩa trong XSD chỉ có các phần tử con và không có các nút văn bản nào. Khoảng trống giữa các phần tử con trong một kiểu phức hợp chỉ gồm các phần tử là có thể bỏ đi được. Loại khoảng trống có thể bỏ đi được này cũng là khoảng trống ranh giới, nó có thể làm cho lẫn lộn hành vi thể hiện khi phân tích cú pháp và xác nhận hợp lệ.
  • Nếu một phần tử đơn giản (chỉ có chứa một nút văn bản) hoặc một thuộc tính được định nghĩa trong XSD như là một kiểu không phải chuỗi ký tự (ví dụ như xs:integer, thì khoảng trống trong phần tử này hoặc giá trị thuộc tính đó có thể bỏ qua được.

Nếu việc xác nhận hợp lệ đã không bỏ qua khoảng trống này, một tài liệu "đẹp" sẽ gặp thất bại khi xác nhận hợp lệ vì nó có chứa các nút văn bản ở nơi không được phép và chứa các ký tự không phải là số trong các giá trị số. Khoảng trống là một phần của một nút văn bản đã định nghĩa trong một phần tử hoặc là một phần của giá trị của một thuộc tính có kiểu xs:string là không thể loại bỏ được và không bị loại bỏ.

Ví dụ, hãy xem Liệt kê 1 ở trên. Theo XSD, các kiểu chuỗi ký tự duy nhất là:

  • Các nút văn bản trong các phần tử name (tên), street (đường phố), city (thành phố), prov-state (tỉnh-bang), pcode-zip (mã bưu điện) và phone (điện thoại).
  • Các thuộc tính country (quốc gia) và type (kiểu).

Có khoảng trống có thể loại bỏ được ở các vị trí sau:

  • Giữa một thẻ bắt đầu và một thẻ bắt đầu liền ngay sau đó -- ví dụ, giữa <customerinfo Cid=' 1000 '><name>
  • Giữa một thẻ kết thúc và một thẻ bắt đầu liền ngay sau đó -- ví dụ, giữa </name><addr ...>
  • Giữa một thẻ kết thúc và một thẻ kết thúc liền ngay sau đó -- ví dụ, giữa </phone></customerinfo>)
  • XSD định nghĩa thuộc tính Cid là một số nguyên:

    <xs:attribute name="Cid" type="xs:integer" />

    Vì vậy khoảng trống xung quanh "1000" là có thể loại bỏ được và sẽ được loại bỏ.

Khoảng trống trong các phần tử name, street, city, prov-state, pcode-zipphone không thể loại bỏ được.

Các lời khuyên:

  • Một số các kịch bản lệnh mẫu mà bạn có thể tìm thấy tại SQLLIB\samples\xml\db2sample_xml.db2 trong bản cài đặt DB2 của bạn chèn XML như thế này:

    XMLVALIDATE( XMLPARSE ( DOCUMENT '...' PRESERVE WHITESPACE ) ...)

    Ví dụ:

    INSERT INTO CUSTOMER ( Cid, Info ) VALUES ( 
        1000,XMLVALIDATE( XMLPARSE ( DOCUMENT
        '<customerinfo xmlns="http://posample.org" Cid=''1000''>...'
        PRESERVE WHITESPACE ) ...)

    Hàm XMLPARSE() giữ lại khoảng trống ranh giới; nhưng XMLVALIDATE() loại bỏ khoảng trống có thể loại bỏ được.

  • CLP DB2 có thể loại bỏ khoảng trống trong chuỗi ký tự bằng chữ, bao gồm XML, trước khi gửi đến DB2. Xem một phần trong hướng dẫn này có tên "DB2 Command Line Processor (CLP) behavior and options" để biết thêm thông tin.
  • CLP DB2 không phải là một ứng dụng CLI, do đó các tùy chọn CLI không áp dụng cho nó.

Sự tuần tự hóa XML

XML thay đổi tại đầu ra

Khi DB2 tuần tự hóa XML, hoặc chuyển đổi nó từ cấu trúc nội tại trở lại thành các ký tự, như khi phân tích cú pháp, chuẩn XML chỉ rõ một số các thay đổi đối với dữ liệu, do đó nó có thể trông khác với những gì ở đầu vào. Mục đích và hiệu quả của những sự thay đổi này là để tạo ra một chuỗi ký tự là tài liệu XML hợp lệ, mà sau đó có thể được phân tích lại.

  • Nếu bảng mã đích không hoàn toàn giống như bảng mã bên trong DB2 là UTF-8, thì các ký tự UTF-8 được chuyển mã theo dạng đích. Các ký tự là các tham chiếu ký tự tại đầu vào vẫn giữ nguyên là ký tự thực tế tại đầu ra, chúng không phải mã hóa lại như một tham chiếu. Các ký tự không có trong bộ ký tự đích sẽ bị mất, được thay thế bằng một ký tự như "?". Xem một phần trong hướng dẫn này mang tên "XML encoding" để biết thêm thông tin.
  • Một khai báo XML được tạo ra nếu bất kỳ điều nào sau đây là đúng:
    • Bạn thực hiện tuần tự hóa tường minh với XMLSERIALIZE(XML-expression INCLUDING XMLDECLARATION).
    • Ứng dụng khách là một ứng dụng CLI hoặc ứng dụng SQL nhúng (ESQL).
    • Ứng dụng khách là một ứng dụng Java hoặc ứng dụng .NET, sử dụng trình điều khiển DB2 cho JDBC và SQLJ, trình này lấy ra XML thành một đối tượng DB2Xml sử dụng lớp com.ibm.db2.jcc.DB2Xml.
  • Một mã đánh dấu trình tự byte (BOM) được tạo ra nếu bảng mã đích là UTF-16.

  • Các ký hiệu và (&), nhỏ hơn (<) và lớn hơn (>) được thay thế bằng các thực thể XML của chúng (tương ứng là (&amp;, &lt;&gt;).

  • Trong các thuộc tính, hai dấu nháy kép (") được thay thế bằng thực thể XML của chúng (&quot;).

  • Trong các giá trị thuộc tính, các ký tự khoảng trống nhất định -- chẳng hạn như CR, LF, và tab -- còn chưa được tiêu chuẩn hóa với XML ở đầu vào được thay thế bằng tham chiếu số của chúng, &#n;, ở đây n là mã hex.

  • Bởi vì các DTD nội tại được bỏ đi khi nhập đầu vào, các ký tự đã được khai triển từ một thực thể được định nghĩa trong một DTD không được mã hóa trở lại như là một tham chiếu thực thể, mà giữ nguyên dạng đã khai triển của chúng.

  • Một phần tử rỗng là một phần tử không có nội dung -- có nghĩa là, không có văn bản hoặc các nút nào giữa các thẻ bắt đầu và kết thúc. Khi được tuần tự hóa ở đầu ra, nó sẽ xuất hiện chỉ như là một thẻ phần tử rỗng, <tag-name/>.

Lời khuyên: tùy chọn -i của CLP DB2 "in đẹp" kết quả đầu ra của một XQuery, bằng cách thêm các dấu ngắt dòng và thụt dầu dòng. Tùy chọn -d tạo ra một khai báo XML ở phần đầu của tài liệu. Xem một phần trong hướng dẫn này mang tên "DB2 Command Line Processor (CLP) behavior and options" để biết thêm thông tin.


Mã hóa XML

Bảng mã ký tự

Trước đây, các thuật ngữ bộ ký tự, mã hóa ký tự (character set, character encoding) và trang mã (code page) tất cả đều có một ý nghĩa tương tự như nhau: một bộ các ký tự và một bộ các mã nhị phân, ở đó mỗi mã biểu diễn cho một ký tự. (Trang mã là một thuật ngữ của IBM dành cho một bộ ký tự dùng trên một máy tính lớn hoặc máy tính cá nhân IBM PC). Các tên chính thức của các bộ ký tự được duy trì bởi IANA (Internet Assigned Numbers Authority - một cơ quan thẩm quyền trông coi việc cấp phát địa chỉ IP, tên miền mức đỉnh và điểm mã giao thức Internet); xem phần Tài nguyên để biết thêm thông tin.

Các bảng mã ký tự di sản thừa kế

Một số các bộ ký tự di sản thừa kế phổ biến trong thế giới phương Tây là US-ASCII, EBCDIC, trang mã 437, trang mã 1252, 8859-1, 1208, và Latin-1. Tất cả chúng mã hoá một ký tự là một byte.

  • Trang mã 437: Trong Microsoft Windows ở Hoa Kỳ, trang mã mặc định là 437; tên bảng mã chính thức IANA là ibm-437. Nó có một số ký tự không phải là tiếng Anh (ví dụ, chữ ghép dính "ae", các nguyên âm chữ thường có dấu trọng âm, một số các chữ cái Hy Lạp, các dấu ngoặc kép Pháp ("<<" và ">>") và 48 ký tự cho đồ họa để tô bóng và tạo các hộp (một di sản thừa kế từ hệ điều hành DOS và các chương trình dựa trên ký tự).

  • Trang mã 1252: DB2 có hai mục trong nhóm trình đơn Start của nó dưới các công cụ dòng lệnh (Command Line Tools:) Bộ xử lý dòng lệnh (Command Line Processor) và cửa số lệnh (Command Window). Cả hai bắt đầu bằng cách chạy một chương trình db2clpcp.exe, nó thay đổi trang mã từ trang 437 mặc định (một lần nữa, tại Hoa Kỳ) thành trang 1252. Trang mã 1252, mà Microsoft cũng gọi là "La-tinh-1", có chữ ghép dính "ae", các ký tự chữ hoa và chữ thường có dấu trọng âm và biểu tượng euro (mã hex 0x80), nhưng không có các chữ Hy Lạp.

  • Trang mã 1208: Khi bạn dùng lệnh CREATE DATABASE USING CODESET UTF-8 (Tạo cơ sở dữ liệu sử dụng bộ mã UTF-8), trang mã cơ sở dữ liệu tương ứng là 1208:

    db2 get db cfg for sample | grep "code"
     Database code page                                      = 1208
     Database code set                                       = UTF-8
     Database country/region code                            = 1
  • Bộ ký tự iso-8859-1: Bộ ký tự này, cũng được gọi là Latin-1, là phổ biến trong các trang Web tiếng Anh hoặc Tây Âu. Nó có chữ ghép dính "ae", các chữ cái Latinh chữ hoa và chữ thường có dấu trọng âm, không có chữ cái tiếng Hy Lạp và không có ký hiệu euro.

Xem Tài nguyên với các đường các liên kết đến các định nghĩa của các bộ ký tự này và các định nghĩa khác.

Unicode

Bất kỳ một bảng mã di sản kế thừa đơn lẻ nào đều có các hạn chế do nó chỉ có thể biểu diễn văn bản trong một tập hợp nhỏ các ngôn ngữ. Việc quản lý nhiều bảng mã là rất đau đầu vì nhiều lý do, không chỉ vì hầu hết các ứng dụng và cơ sở dữ liệu đã được thiết kế để xử lý chỉ một bảng mã. Unicode đã được phát minh để giải quyết vấn đề này. Nó là một bộ ký tự đơn lẻ, biểu diễn được tất cả các ký tự trong hầu như tất cả các ngôn ngữ đang sử dụng, và có dành chỗ để phát triển thêm

Với mã Unicode, ý tưởng đơn giản về một bộ ký tự đã được tinh lọc thành bốn khái niệm:

  • Một kho ký tự chỉ đơn thuần là một bộ tất cả các ký tự có thể được mã hóa, nó không chỉ rõ bảng mã.
  • Một bộ ký tự được mã hóa một bộ các số nguyên duy nhất để biểu diễn một số hoặc tất cả các ký tự trong một kho ký tự, một số (hoặc điểm mã (code point)) dành cho một ký tự. Nó còn được gọi là bộ ký tự (character set, charset), hoặc bộ mã (code set). Nó đồng nghĩa với trang mã (code page). Các điểm mã Unicode nằm trong dải 0 đến 0x10FFFF (khoảng 1,1 triệu mã).
  • Ban đầu, mã Unicode đã định nghĩa một kho ít hơn 64.000 ký tự, nên nó có thể định rõ một bộ ký tự được mã hóa với các điểm mã 16-bit (2-byte). Với việc bổ sung thêm nhiều các bảng chữ cái, kho ký tự đã vượt quá 64.000. Một vấn đề khác là có nhiều hệ thống máy tính (đặc biệt là các chương trình được viết bằng ngôn ngữ C) xử lý US-ASCII hoặc những hệ thống khác sử dụng một byte null hoặc byte số không (\0 trong C) để đánh dấu sự kết thúc của một chuỗi ký tự. Thế nhưng việc mã hóa các điểm mã Unicode trực tiếp thành 16-bit, hoặc nhiều bít hơn sẽ bao gồm một số byte null, điều này có thể làm đổ vỡ các chương trình nói trên.

    Do đó Unicode đã đưa vào một khái niệm mới character encoding form (CEF - mẫu biểu mã ký tự), thường được viết tắt là character encoding (bảng mã ký tự) hoặc chỉ đơn giản là encoding encoding (bảng mã). Một CEF là một ánh xạ từ các điểm mã trong bộ ký tự được mã hóa tới một bộ các số nguyên khác nhau (hoặc các đơn vị mã (code units)) trong đó các ký tự sẽ thực sự được mã hoá. Các đơn vị mã là đơn vị nhỏ nhất được sử dụng để mã hóa các ký tự. Một ký tự duy nhất có thể được biểu diễn bởi một hay nhiều đơn vị mã, cho phép nhiều ký tự hơn được mã hóa.

    Vì vậy các điểm mã chỉ để tham chiếu, do đó bạn có thể nói ký tự "đó" thực tế trong chuỗi ký tự của Java, chuỗi ký tự char[] của C hoặc tệp tin có thể khác nhau, tùy thuộc vào bảng mã ký tự của bạn. Một số bảng mã ký tự Unicode là UTF-8, UTF-16 và UTF-32. Những con số 8, 16 và 32 biểu thị số bit trong đơn vị mã.

    • UTF-8 (mà DB2 sử dụng) sử dụng từ 1 đến 4 đơn vị mã (byte, trong trường hợp này) cho mỗi ký tự. Điều này rất quan trọng khi định kích cỡ các cột [VAR]CHAR trong một cơ sở dữ liệu UTF-8: một ký tự có thể chiếm từ 1 đến 4 byte. Bảng mã ký tự UTF-8 không chứa bất kỳ byte null nào, rất thuận tiện cho ngôn ngữ C.
    • Trong bảng mã ký tự UTF-16 (mà ngôn ngữ Java sử dụng), các điểm mã được sử dụng phổ biến nhất thấp hơn 64K và mã ký tự UTF-16 đơn giản là bằng điểm mã. Điểm mã cao hơn đòi hỏi hai đơn vị mã.
    • UTF-32 là bảng mã UTF có kích thước cố định duy nhất, nó làm đơn giản hoá một số việc xử lý với chi phí không gian nhớ tăng lên. Đơn vị mã luôn luôn bằng điểm mã.

    Kể từ khi chuẩn Unicode hạn chế các điểm mã hợp pháp sao cho tất cả các bảng mã UTF có thể biểu diễn bất kỳ điểm mã nào, việc chuyển đổi mã giữa các UTF được đảm bảo không bị mất mát.

    Các điểm mã Unicode thường được viết trong tài liệu dưới dạng U+hhhh, ở đây hhhh đại diện cho 4 chữ số hexadecimal với điểm mã 2-byte; đối với các điểm mã trên 64K, hãy sử dụng cú pháp này hai lần với 4 byte. Lưu ý rằng cú pháp này được sử dụng trong tài liệu, nhưng XML và các ngôn ngữ lập trình có cú pháp riêng của chúng để chỉ rõ chuỗi ký tự bằng chữ Unicode; xem phần mang tên "Characters in code" (Ký tự trong mã lệnh) dưới đây để biết thêm thông tin.

  • Một lược đồ mã hóa ký tự cho biết làm thế nào để sắp xếp thứ tự các byte trong một đơn vị mã trong một luồng byte biểu diễn các ký tự. UTF-16 và UTF-32 cung cấp các cách để xác định thứ tự byte, đó là big-endian (mặc định), hoặc little-endian. Đối với UTF-8, một đơn vị mã là 1 byte, do đó không có thứ tự -- nói cách khác, việc sắp xếp thứ tự luôn luôn là như nhau bất kể thứ tự endian của máy tính.

Bảng mã nào?

Bất cứ điều gì có xử lý dữ liệu ký tự cần phải biết bộ ký tự, bảng mã ký tự và lược đồ mã hóa ký tự của dữ liệu đó.

Bảng mã ngoài

Ngoài XML, văn bản chỉ có bảng mã ngoài. Bảng mã ngoài được định nghĩa bởi trang mã hoặc địa phương (locale) trong môi trường; bởi ứng dụng; bởi kiểu biến; hoặc một bảng mã được chỉ rõ trong một hàm hoặc phương thức (ví dụ như phương thức String.getBytes(String encoding)).

Để xác định trang mã cơ sở dữ liệu trong đó một cơ sở dữ liệu đã được tạo ra, hãy chạy:

db2 get db cfg for database-name

và kiểm tra giá trị của tham số Database code page (Trang mã cơ sở dữ liệu).

Trên Windows, một số khía cạnh của bảng mã phụ thuộc vào phiên bản đã cài đặt của hệ điều hành. Chương trình máy khách (applet) "Các tùy chọn Vùng và Ngôn ngữ" (Regional and Language Options) trong bàn điều khiển (Control Panel) cho phép bạn thay đổi một số khía cạnh về địa phương (locale) và bàn phím của bạn. Bạn có thể biết trang mã của bạn là gì bằng cách mở một cửa sổ lệnh và gõ lệnh CHCP.

Trên Linux và UNIX, môi trường hoạt động được xác định từ các giá trị thiết lập địa phương, trong đó bao gồm các thông tin về ngôn ngữ, lãnh thổ và bộ mã. Để xác định trang mã đang hoạt động, hãy chạy:

locale

Bảng mã trong

Dữ liệu XML cũng có thể có bảng mã trong. Bảng mã trong là nội bộ ở bên trong tài liệu XML. Có hai loại:

  • Thuộc tính Encoding.
  • Byte Order Mark (BOM-Mã đánh dấu thứ tự byte).

Thuộc tính Encoding cho khai báo XML, ở phía trên cùng của tài liệu, chỉ rõ một tên bảng mã IANA chính thức:

<?xml version="1.0" encoding="UTF-8" ?>

Một BOM là một loạt các byte riêng biệt, ngay tại chỗ bắt đầu của tệp tin, chỉ báo một bảng mã Unicode. Để đọc khai báo XML, một trình phân tích cú pháp XML cần phải biết hoặc dự đoán bảng mã đó. Nhưng nó có thể đọc BOM một cách chính xác.

Bảng 1. BOM dành cho bảng mã Unicode
Kiểu BOMGiá trị BOMBảng mã
UTF-8X'EFBBBF'UTF-8
UTF-16 Big EndianX'FEFF'UTF-16
UTF-16 Little EndianX'FFFE'UTF-16
UTF-32 Big EndianX'0000FEFF'UTF-32
UTF-32 Little EndianX'FFFE0000'UTF-32

Bảng mã không nhất quán

Nếu bảng mã thực tế, bảng mã ngoài hay các bảng mã trong (BOM hoặc khai báo XML) của một tài liệu XML không phù hợp với nhau, thì tài liệu sẽ không thể đọc được. Một ngoại lệ là khi bảng mã bên ngoài là Unicode (ví dụ, một chuỗi ký tự Java theo UTF-16): bất kỳ bảng mã trong nào bị cũng bị bỏ qua. Một vấn đề thường xảy ra khi một tiến trình không hiểu XML thực hiện các phép chuyển mã (có nghĩa là, thay đổi bảng mã thực tế) hoặc thay đổi một tài liệu mà không biết rõ về bảng mã trong. Một số việc xử lý các chuỗi ký tự trong ngôn ngữ Java, CLI và các ứng dụng SQL nhúng có thể chuyển mã mà không thay đổi bảng mã trong. Xem phần dưới đây mang tên "Recommendations" (Các khuyến cáo) về cách làm thế nào để tránh điều này.

Các ký tự trong mã hóa

Trong Windows, để nhập văn bản của một ngôn ngữ khác tại bàn phím của bạn, bạn có thể thay đổi ngôn ngữ đầu vào và bố trí bàn phím trong Control Panel của Windows, trong mục "Regional and Language Options"; nhấn chuột vào nút Details trên phiếu Languages. Bạn có thể thêm nhiều ngôn ngữ và các bàn phím và chuyển đổi giữa chúng bằng một phím nóng. (Xin lỗi, không có "ngôn ngữ" hoặc bàn phím Unicode -- nó sẽ phải khá lớn đấy!).

Tiện ích Notepad của Windows có thể lưu các tệp tin với bảng mã "ANSI" (là windows-1252 hay tương tự), bảng mã "Unicode” (UTF-16 little endian, thứ tự endian của các CPU Intel và AMD), bảng mã "Unicode big endian"( mặc định UTF-16) và UTF-8. Đối với các bảng mã UTF, Notepad gắn thêm vào đầu tệp tin một BOM (nhưng không có khai báo XML).

Trong một chuỗi ký tự Java bằng chữ, theo mã Unicode, sử dụng một dãy thoát: \udddd, ở đây dddd biểu diễn 4 chữ số hex của điểm mã Unicode.

Trong XML và HTML, bạn có thể sử dụng một tham chiếu số XML (hoặc tham chiếu ký tự) cho một điểm mã, đó là : &#n, ở đây n ở đây n là một số thập phân cho điểm mã Unicode. Ví dụ, tham chiếu thập phân cho biểu tượng đồng tiền euro là &#8364. Để thay thế bạn có thể chỉ rõ điểm mã như là một số hệ mười sáu (hex) bằng cách đặt trước số đó ký tự x: &#xn. Ví dụ, euro sẽ là &#x20AC;. Một tham chiếu số hệ mười sáu thường thuận tiện hơn, bởi vì điểm mã thường được chỉ rõ bằng số hệ mười sáu. Đối với các tham chiếu số, các số không đứng đầu có thể được bỏ qua. Mỗi ký tự phải dùng dấu thoát hoặc được tham chiếu một cách riêng biệt: ví dụ, "&#x21;&#x22;" là "!”" (dấu chấm than, dấu nháy kép), trong khi "&#x2122;" là dấu "™" (nhãn hiệu đăng ký hàng hoá).

Bảng 2 minh họa một số ký tự mẫu, với điểm mã Unicode và mã ký tự của chúng trong các bảng mã UTF và hai trang mã phương Tây di sản thừa kế.

Bảng mã trong ngôn ngữ Java

Các chuỗi ký tự (String) của Java (và các mã định danh như các tên lớp và tên phương thức) được mã hóa bằng UTF-16, nhưng tệp mã nguồn của bạn được giả định là dùng trang mã hiện tại, chứ không phải UTF-16. Khi biên dịch một chương trình Java với javac, trình biên dịch sẽ chuyển đổi bất kỳ chuỗi ký tự bằng chữ nào từ bảng mã của tệp mã nguồn thành UTF-16. Để chỉ rõ rằng tệp mã nguồn là trong bảng mã khác, hãy sử dụng tùy chọn mã hóa của javac-encoding code-set-name. Điều này cho phép bạn sử dụng một bảng mã khác trong các mã định danh và các chuỗi ký tự bằng chữ của bạn.

DB2 9 cung cấp một lớp trình trợ giúp (helper), com.ibm.db2.jcc.DB2Xml, để giúp chuyển giao và chuyển đổi dữ liệu giữa cơ sở dữ liệu và ứng dụng Java. Nó hiểu XML tốt hơn; ví dụ, một số các phương thức có thể chuyển đổi bảng mã bên trong của một tài liệu XML được tuần tự hóa tuân theo bảng mã thực tế, do đó, chúng vẫn còn nhất quán.

Bảng 3. Các phương thức getter của JDBC: Kiểu trả về, bảng mã và khai báo
Phương thứcKiểu trả vềBảng mãCó bổ sung thêm khai báo XML với thuộc tính encoding không?
getDB2String()StringUTF-16Không
getDB2XmlString()StringISO-10646-UCS-2
getDB2Bytes()byte[ ]UTF-8Không
getDB2XmlBytes(String targetEncoding)byte[ ]Như đã chỉ rõ
getDB2AsciiStream()InputStreamASCIIKhông
getDB2XmlAsciiStream()InputStreamASCII
getDB2CharacterStream()java.io.ReaderUTF-16Không
getDB2XmlCharacterStream()java.io.ReaderISO-10646-UCS-2
getDB2BinaryStream()InputStreamUTF-8Không
getDB2XmlBinaryStream(String targetEncoding)InputStreamNhư đã chỉ rõ

DB2 9 đi kèm với 2 trình điều khiển JDBC có thể kết nối với DB2 theo ba cách khác nhau (DB2 9 không hỗ trợ các trình điều khiển Kiểu 3 của JDBC):

  • Trình điều khiển DB2 cho JDBC và SQLJ, một trình điều khiển JDBC phổ quát, nó có thể kết nối như là:
    • Một trình điều khiển Kiểu 4 của JDBC.
    • Một trình điều khiển Kiểu 2 của JDBC.
  • Một trình điều khiển Kiểu 2 JDBC của DB2 (một trình điều khiển di sản thừa kế).

Bạn nên sử dụng trình điều khiển DB2 phổ quát cho JDBC và SQLJ. Trình điều khiển Kiểu 2 di sản thừa kế đã bị lạc hậu kể từ phiên bản DB2 8.2. Trình điều khiển JDBC Kiểu 2 di sản không làm việc với lớp DB2 com.ibm.db2.jcc.DB2Xml, và nó xử lý XML khác đi trong một số phương thức JDBC. Ví dụ, các phương thức, get (chẳng hạn như, ResultSet.getBinaryStream(column), ResultSet.getCharacterStream(column), ResultSet.getString(column)) trong một câu lệnh SELECT lấy ra một cột XML (không dùng XMLSERIALIZE() tường minh) sẽ thêm một BOM và khai báo XML vào kết quả XML đã tuần tự hóa. Hoặc bảng mã trong (UTF-16) không khớp với bảng mã thực tế hoặc là BOM bị hỏng, đều làm cho tài liệu không thể sử dụng được.

Xem Bảng 4 để biết thêm thông tin về các phiên bản của trình điều khiển JDBC.

Đối với bất kỳ kiểu kết nối JDBC nào, nếu bạn muốn kết nối như là một người dùng khác với người dùng hiện tại, bạn phải chỉ rõ tên người dùng mong muốn và mật khẩu hoặc trong URL kết nối hoặc trong đối số Properties của phương thức getConnection().

DB2 cung cấp các ứng dụng JDBC mẫu trong thư mục IBM\SQLLIB\samples\xml\java\jdbc, chẳng hạn như XmlInsert.java. Nếu bạn sử dụng chúng để thử nghiệm, hãy lưu ý rằng theo mặc định, chúng kết nối đến DB2 với trình điều khiển Kiểu 2 di sản thừa kế. (Xem lớp của trình trợ giúp Db trong tệp tin Util.java). Để kết nối với các trình điều khiển Kiểu 4, bạn phải chỉ rõ các đối số dòng lệnh dành cho máy chủ, cổng, người dùng và mật khẩu. Để xem một thông báo về cú pháp, hãy chạy lớp với đối số dòng lệnh -help:

prog_name -u2 [dbAlias] [userId passwd] (use universal JDBC type 2 driver)
prog_name [dbAlias] server portNum userId passwd (use universal JDBC type 4 driver)

Ví dụ:

java -cp ".;%CLASSPATH%" XmlInsert sample myhost 50000 myuser mypasswd

Xem phần Tải về để lấy các mã ví dụ giải thích cách DB2, JDBC và lớp DB2Xml xử lý bảng mã như thế nào.

Bảng mã trong CLI

Khi bạn chèn XML vào DB2 và kết buộc một biến với một cột XML bằng phương thức SQLBindParameter(), CLI sẽ xác định bảng mã của XML theo các quy tắc đầu vào trong Bảng 5 dưới đây. Nếu bảng mã được xác định bởi trang mã của ứng dụng, nhưng tài liệu cũng có một bảng mã trong (một BOM hoặc khai báo XML), thì các bảng mã ngoài và bảng mã trong phải khớp với nhau. Khi bạn chọn lấy ra XML từ DB2 vào trong một biến chủ SQL nhúng (ESQL), dữ liệu được mã hoá theo Bảng 5, với một bảng mã bên trong (một khai báo XML với thuộc tính mã hóa).

Bảng 5. Các kiểu CLI
Kiểu dữ liệuBảng mã được giả định tại đầu vàoBảng mã được sinh ra tại đầu ra
SQL_C_CHARTrang mã của ứng dụngGiống như đầu vào
SQL_C_DBCHARTrang mã của ứng dụngGiống như đầu vào
SQL_C_WCHARUCS-2Giống như đầu vào
SQL_C_BINARYĐọc bảng mã bên trongUTF-8

Bảng mã trong SQL nhúng

Khi bạn chèn XML vào trong DB2 từ một biến chủ SQL nhúng (ESQL), bảng mã của XML được xác định theo các quy tắc đầu vào trong Bảng 6. Nếu bảng mã được xác định bởi trang mã của ứng dụng, nhưng tài liệu cũng có một bảng mã trong (BOM hoặc khai báo XML), thì các bảng mã ngoài và bảng mã trong phải phù hợp với nhau. Khi bạn chọn lấy ra XML từ DB2 vào trong một biến chủ ESQL, dữ liệu được mã hoá theo Bảng 6, với một bảng mã bên trong (một khai báo XML với thuộc tính mã hóa).

Bảng 6. Các kiểu ESQL
KIểu SQL là Bảng mã được giả định tại đầu vàoBảng mã được sinh ra tại đầu ra
XML AS CLOB, XML AS CLOB_FILETrang mã hỗn hợp của ứng dụngGiống như đầu vào
XML AS DBCLOB, XML AS DBCLOB_FILETrang mã hỗn hợp của ứng dụngGiống như đầu vào
XML AS BLOB, XML AS BLOB_FILEĐọc bảng mã bên trong (Chú ý 1)UTF-8
Một kiểu đơn giản như char[]Trang mã hỗn hợp của ứng dụng (Chú ý 2)Giống như đầu vào

Chú ý 1: Nếu một biến kiểu BLOB không có bất kỳ bảng mã bên trong nào, DB2 giả định là UTF-8.

Chú ý 2: Để chèn XML từ một kiểu đơn giản như char, hãy tạo khuôn mẫu cho nó thành XML bằng hàm XMLCAST(? AS XML).

Các khuyến cáo

  • Hãy chuyển các chuỗi ký tự bằng chữ như là các lời nhắc và các thông báo lỗi ra khỏi tệp mã nguồn của bạn và đưa vào một dạng tệp thuộc tính hoặc tệp khởi tạo nào đó hay đưa vào một bảng cơ sở dữ liệu. Điều này sẽ làm dễ dàng hơn khi dịch các ứng dụng của bạn sang các ngôn ngữ khác. Bạn có thể phải mã cố định một vài thông báo lỗi vào trong các ứng dụng của bạn, trong trường hợp ứng dụng này không thể mở tệp tin thông báo đó hoặc chọn lấy ra từ bảng các thông báo đó.
  • Hãy tránh chuyển mã giữa các bộ ký tự không phải mã Unicode, vì sợ rằng bạn sẽ mất các ký tự không có trong bộ ký tự đích.
  • Hãy thử nghiệm các ứng dụng của bạn không viết bằng ngôn ngữ Java với các trang mã khác nhau trong môi trường ứng dụng. Bạn có thể không có khả năng kiểm soát trang mã của những người dùng của bạn. (Trang mã ứng dụng Java luôn luôn là UTF-16).
  • Hãy thử nghiệm ứng dụng của bạn với một số dữ liệu không phải mã ASCII. Các trang mã 437, 1252, 8859-1 và 1208 (bảng mã UTF-8) tất cả khớp với mã US-ASCII trong 128 byte đầu tiên, do đó dữ liệu mã US-ASCII ít có khả năng gặp bất kỳ vấn đề nào về mã hóa và chuyển mã. Kiểm tra về việc mất các ký tự lúc chuyển mã, nó thường không tạo ra thông báo lỗi.
  • Hãy sử dụng trình điều khiển DB2 phổ quát cho JDBC và SQLJ hơn là dùng trình điều khiển Kiểu 2 di sản thừa kế. Nếu bạn không thể kiểm soát trình điều khiển mà các ứng dụng của bạn sử dụng, thử nghiệm nó với một kiểu hoặc các kiểu sẽ chạy trong sản xuất và tránh các phương thức không làm việc trong tất cả các kiểu hoặc làm việc một cách khác nhau.
  • Đối với các ứng dụng C, để xử lý XML trong kiểu dữ liệu char[], hãy sử dụng bảng mã UTF-8, vì nó không chứa null (\0) như là một byte hợp lệ.
  • Đối với các ứng dụng CLI và ESQL, hãy lưu ý rằng CLI trả về dữ liệu XML với bảng mã bên trong. Nếu bạn chuyển mã và thay đổi bảng mã thực tế, tài liệu sẽ trở nên không sử dụng được. Để tránh điều này, hãy kết buộc biến ứng dụng của bạn tới kiểu SQL_C_BINARY; điều này cũng giữ các dữ liệu dưới dạng UTF, tránh việc bị mất mát khi chuyển mã thành trang mã nội bộ của bạn.
  • Đối với bất kỳ kiểu dữ liệu nào chứa các ký tự UTF, hãy cho phép đủ độ rộng, bởi vì một ký tự có thể dùng nhiều hơn một byte.

Xác nhận hợp lệ các tài liệu XML

Khái niệm

Một tài liệu XML có tính linh hoạt về cấu trúc hơn nhiều so với một bảng quan hệ. Một bảng có một cấu trúc cố định, mà các câu lệnh SELECT có thể dựa vào nó. Có một số chính xác các cột với các kiêu dữ liệu cụ thể. Một tài liệu XML gần như hoàn toàn ngược lại. Nó có thể biến đổi trong mọi chi tiết -- các tên nút, chiều sâu của hệ thống phân cấp, các kiểu dữ liệu, các thuộc tính, v.v. Những người viết truy vấn cần phải biết về cấu trúc dữ liệu XML. Để cung cấp dữ liệu theo trật tự trong thế giới XML, có khái niệm về xác nhận hợp lệ được các lược đồ XML cung cấp.

Một Lược đồ XML giống như một cuốn sách quy tắc cho các tài liệu XML khác. Nó cung cấp thông tin chi tiết về những gì được phép trong các tài liệu XML -- các tên nút, thứ tự các nút, các thuộc tính, các kiểu dữ liệu, là tùy chọn hay bắt buộc phải có, v.v. Bản sao của nó trong thế giới quan hệ trong DB2 là SYSCAT.COLUMNS. Các lược đồ XML bản thân chúng chính là các tài liệu XML, có các quy tắc rất cụ thể về cấu trúc riêng của nó. Một tài liệu XML tuân thủ đúng các quy tắc của một Lược đồ XML gọi là đã được được xác nhận hợp lệ hay hợp lệ.

Làm thế nào để xác nhận hợp lệ

Trong một cột cơ sở dữ liệu có kiểu XML, mỗi hàng có chứa chính xác một tài liệu XML đầy đủ (hoặc một giá trị null). Tài liệu đó hoặc là hợp lệ hoặc không. Việc xác nhận hợp lệ được thực hiện bằng hàm XMLVALIDATE(). Để thực hiện việc xác nhận tính hợp lệ, trước tiên phải đăng ký với cơ sở dữ liệu các tài liệu Lược đồ XML (XSD - XML Schema Documents) thích hợp. Sau đó, có thể sử dụng hàm XMLVALIDATE(). Hàm này chấp nhận một tài liệu XML như là đầu vào, cùng với mã định danh (ID) một Lược đồ XML phù hợp và trả về một tài liệu XML được xác nhận hợp lệ.

Các cách để xác nhận tính hợp lệ tài liệu XML trong một cột XML (lưu ý rằng không bao gồm câu lệnh LOAD):

  • Câu lệnh INSERT: Sử dụng XMLVALIDATE().
  • Câu lệnh UPDATE: Sử dụng XMLVALIDATE().
  • Câu lệnh IMPORT: Có cú pháp để xác nhận tính hợp lệ.

Một ví dụ đầy đủ về việc đăng ký một Lược đồ XML và sử dụng XMLVALIDATE() có thể tìm thấy trong bài viết "Get off to a fast start with DB2 Viper" (Hứng khởi để bắt đầu nhanh với DB2 Viper ) (developerWorks, 03. 2006).

Kiểm tra để xác nhận hợp lệ

Một cột XML có thể được kiểm tra để xác định xem nó chứa một tài liệu XML hợp lệ hay không với vị từ VALIDATED.

Ví dụ 1: Giả sử rằng cột XMLCOL được định nghĩa trong bảng T1. Hãy lấy ra chỉ các giá trị XML đã được xác nhận hợp lệ bởi một lược đồ XML bất kỳ.

   SELECT xmlcol
   FROM
          t1
   WHERE
          xmlcol IS VALIDATED

Ví dụ 2: Giả sử rằng cột XMLCOL được định nghĩa trong bảng T1. Hãy buộc tuân thủ quy tắc là các giá trị không thể được chèn vào hoặc được cập nhật trừ khi chúng đã được xác nhận hợp lệ.

   ALTER TABLE t1
     ADD CONSTRAINT ck_validated
       CHECK (xmlcol IS VALIDATED)

Lưu ý rằng ràng buộc này kiểm tra xem liệu cột XML có được xác nhận hợp lệ bằng bất kỳ Lược đồ XML nào không. Bạn không thể bắt buộc xác nhận hợp lệ bằng một lược đồ cụ thể.

Để tìm ra Lược đồ XML cụ thể nào đã được sử dụng để xác nhận tính hợp lệ một tài liệu XML, hãy sử dụng hàm XMLXSROBJECTID(). Nó trả về khóa của một hàng trong bảng SYSCAT.XSROBJECTS.


XPath và XQuery

XPath và XQuery đã được trình bày trong một số hướng dẫn. Xem các liên kết sau trong phần Tài nguyên:

Đọc các truy vấn ví dụ, dự đoán các kết quả, sau đó kiểm tra câu trả lời của bạn bằng cách chạy các truy vấn đối với DB2.


Các hàm SQL/XML

Hàm vô hướng XMLQUERY() và XMLEXISTS()

Hàm XMLQUERY() trả về một giá trị XML sau khi đánh giá một biểu XQuery, có thể sử dụng các đối số đầu vào đã chỉ rõ như các biến XQuery.

Đây là trích ra nguyên xi từ hướng dẫn sử dụng. Vậy thì, ý nghĩa thực tế của điều này là gì? Hàm XMLQUERY() có hai phần:

  • Một biểu thức XQuery.
  • Một mệnh đề PASSING, ở đó dữ liệu có thể được chuyển vào biểu thức XQuery.

Cách sử dụng thông thường của hàm này là để trích một phần của một tài liệu XML. Một cột XML trong một bảng (nếu nó không phải null) có chứa một tài liệu XML trọn vẹn. Trong một danh sách SELECT, nếu bạn chọn tên cột XML, bạn sẽ có được toàn bộ tài liệu XML. Nếu bạn muốn một phần nhỏ trong toàn bộ tài liệu, thì bạn sử dụng hàm XMLQUERY(). Đối với biểu thức XQuery, bạn có thể sử dụng một biểu thức XPath đơn giản như '$d/path1/path2/path3', hay một biểu thức FLWOR đầy đủ. Ký hiệu $d nói tới một biến trong mệnh đề PASSING. Mệnh đề này cho phép dữ liệu (các cột, các biểu thức, các dữ liệu bằng chữ) được chuyển vào biểu thức XQuery. Để trích một phần của một tài liệu XML, tên cột XML được đưa vào trong mệnh đề PASSING và đặt cho một cái tên, vị dụ như "d". Sau đó, biểu thức XQuery được nói đến như là $d.

XMLEXISTS() là một vị từ được sử dụng trong mệnh đề WHERE của một câu lệnh SELECT. Cú pháp của nó tương tự như XMLQUERY(): nó có một biểu thức XQuery và một mệnh đề PASSING. Giống như với XMLQUERY(), đối số XQuery có thể là một biểu thức XPath đơn giản hoặc biểu thức FLWOR đầy đủ. Nếu biểu thức XQuery trả về ít nhất một mục, thì XMLEXISTS() trả về TRUE.

XMLEXISTS() thường được sử dụng để kiểm tra xem một tài liệu XML (trong một cột XML) có chứa một cái gì đó đáng quan tâm không. Một cái gì đó có thể là sự tồn tại của một nút XML đặc biệt, sự tồn tại của một thuộc tính, một giá trị cụ thể cho một nút XML hay giá trị cụ thể cho một thuộc tính. Nhiều điều kiện có thể được kiểm tra. Thường là hiệu quả hơn nhiều khi kết hợp nhiều điều kiện XML thành một XMLEXISTS() với các toán tử andor của XPath, hơn là thực hiện nhiều cuộc gọi XMLEXISTS() kết hợp với ANDOR của SQL.

Nhiều truy vấn XML có thể được xử lý bằng cả XQuery lẫn XMLQUERY(). Có một số khác biệt giữa XQuery và XMLQUERY():

  • XQuery trả về mỗi mục trong dãy kết quả như là một hàng riêng biệt. XMLQUERY() là một hàm vô hướng và một phần của một câu lệnh SELECT; nó chỉ trả về một giá trị cho mỗi cuộc gọi (có nghĩa là, cho mỗi tài liệu XML được chuyển tới nó). Nếu có nhiều mục trong một tài liệu XML, XMLQUERY() phải có khả năng để trả chúng về trong một hàng. Do vậy nó sẽ trả về một chuỗi có chứa tất cả các mục từ tài liệu đó.

  • Bạn không thể kết buộc các tham số hoặc sử dụng các biến chủ trong XQuery. Nhưng bạn có thể kết buộc trong XMLQUERY()XMLEXISTS() với mệnh đề PASSING.

  • Trong XQuery, một biểu thức XPath (ví dụ, /path1/path2) thực hiện vai trò áp dụng các vị từ (dùng ký pháp ([]) và lên kế hoạch (projecting) (xây dựng danh sách đầu ra của các phần tử) tất cả cùng nhau trong một bước. Trong một câu lệnh SELECT, vai trò áp dụng các vị từ cho các hàng được XMLEXISTS() ; xử lý; vai trò áp dụng các vị từ cho các nút trong một hàng, và lên kế hoạch,được XMLQUERY() xử lý. Thông thường trong một truy vấn SQL/XML, cùng một vị từ XPath được chỉ rõ hai lần, trong XMLEXISTS()XMLQUERY().

  • Để áp dụng các vị từ cho các cột quan hệ, XQuery sử dụng hàm Xpath db2-fn:sqlquery(). Một câu lệnh SELECT chính quy với XMLQUERY() sử dụng mệnh đề WHERE, tiêu chuẩn của nó, mệnh đề này có thể trộn lẫn các vị từ quan hệ với XMLEXISTS().

  • Chỉ XMLQUERY() có thể trộn lẫn các cột quan hệ và dữ liệu XML trong cùng một danh sách SELECT.

Xem bài viết "Query DB2 XML data with SQL" (Truy vấn dữ liệu DB2 XML với SQL) (developerWorks, 03. 2006), nó bao gồm các ví dụ chi tiết về XMLQUERY()XMLEXISTS() đang hoạt động.

Các hàm vô hướng XMLELEMENT(), XMLATTRIBUTES() và XMLNAMESPACES()

Hàm vô hướng XMLELEMENT() tạo ra một phần tử XML, bằng cách bao bọc một thẻ XML (ví dụ, <xxx></xxx>) xung quanh một cái gì đó. Một cái gì đó này có thể là bất kỳ biểu thức SQL nào (miễn là nó không phải là một kiểu có cấu trúc), kể cả các phần tử khác XML. Các vùng tên và các thuộc tính có thể được bao gồm hoặc không tùy trường hợp. Các biểu thức SQL sẽ được tự động chuyển đổi thành dạng ký tự của chúng, nếu cần thiết, giống như khi chúng đã được bao bọc trong hàm CHAR().

Hàm XMLATTRIBUTES() tạo ra một hoặc nhiều thuộc tính trong một phần tử XML (ví dụ, <xxx a1="zzz">). Hàm này chỉ có thể được sử dụng trong hàm XMLELEMENT().

Hàm XMLNAMESPACES() tạo ra các khai báo vùng tên cho một phần tử XML. Điều này chỉ có thể được sử dụng trong các hàm khác như XMLELEMENT(), XMLFOREST()XMLTABLE().

Ví dụ 1: XMLELEMENT() đơn giản

Liệt kê 4. Ví dụ 1 mã SQL
SELECT XMLELEMENT( NAME "ColName", colname),
       XMLELEMENT( NAME "Type", typename)
FROM
       syscat.columns
WHERE
       tabschema = 'SYSCAT'
AND    tabname   = 'TABLES'
ORDER BY
       colno
;
Liệt kê 5. Kết quả đầu ra mẫu của ví dụ 1
<ColName>TABSCHEMA</ColName>        <Type>VARCHAR</Type>
<ColName>TABNAME</ColName>          <Type>VARCHAR</Type>
<ColName>OWNER</ColName>            <Type>VARCHAR</Type>
<ColName>TYPE</ColName>             <Type>CHARACTER</Type>
<ColName>STATUS</ColName>           <Type>CHARACTER</Type>
<ColName>BASE_TABSCHEMA</ColName>   <Type>VARCHAR</Type>
<ColName>BASE_TABNAME</ColName>     <Type>VARCHAR</Type>
<ColName>ROWTYPESCHEMA</ColName>    <Type>VARCHAR</Type>
<ColName>ROWTYPENAME</ColName>      <Type>VARCHAR</Type>
<ColName>CREATE_TIME</ColName>      <Type>TIMESTAMP</Type>
<ColName>INVALIDATE_TIME</ColName>  <Type>TIMESTAMP</Type>
<ColName>STATS_TIME</ColName>       <Type>TIMESTAMP</Type>
<ColName>COLCOUNT</ColName>         <Type>SMALLINT</Type>
<ColName>TABLEID</ColName>          <Type>SMALLINT</Type>
<ColName>TBSPACEID</ColName>        <Type>SMALLINT</Type>

Ví dụ 2: XMLELEMENT() hai thuộc tính

Liệt kê 6. Ví dụ 2 mã SQL
SELECT XMLELEMENT
       (
         NAME "TableName",
         XMLATTRIBUTES ( tableid AS "TableId", colcount AS "NumCols" ),
         RTRIM(tabschema) || '.' || tabname
       )
FROM
       syscat.tables
WHERE
       type = 'T'
ORDER BY
       tableid
;
Liệt kê 7. Kết quả đầu ra mẫu của ví dụ 2
<TableName TableId="2" NumCols="67">SYSIBM.SYSTABLES</TableName>
<TableName TableId="2" NumCols="44">DB2QP.TRACK_QUERY_INFO</TableName>
<TableName TableId="2" NumCols="3">TOOLS.REL_CAT_MEMBER</TableName>
<TableName TableId="3" NumCols="41">SYSIBM.SYSCOLUMNS</TableName>
<TableName TableId="3" NumCols="13">DB2QP.MANAGE_QUERY_INFO</TableName>
<TableName TableId="3" NumCols="9">TOOLS.REL_TYPE</TableName>
<TableName TableId="4" NumCols="57">SYSIBM.SYSINDEXES</TableName>
<TableName TableId="4" NumCols="6">DB2QP.RESULT_INFO</TableName>
<TableName TableId="4" NumCols="5">SYSTOOLS.POLICY</TableName>
<TableName TableId="4" NumCols="8">TOOLS.REL_CAT</TableName>
<TableName TableId="5" NumCols="9">SYSIBM.SYSCOLPROPERTIES</TableName>
<TableName TableId="5" NumCols="23">DB2QP.QP_SYSTEM</TableName>
<TableName TableId="5" NumCols="27">SYSTOOLS.HMON_ATM_INFO</TableName>
<TableName TableId="5" NumCols="5">TOOLS.REL_LINK</TableName>
<TableName TableId="6" NumCols="5">SYSIBM.SYSINDEXCOLUSE</TableName>

Ví dụ 3: XMLELEMENT() với vùng tên mặc định

Liệt kê 8. Ví dụ 3 mã SQL
SELECT  XMLELEMENT
        (
          NAME "ColName",
          XMLNAMESPACES ( DEFAULT 'www.ibm.com' ),
          colname
        )
FROM
        syscat.columns
WHERE
        tabschema = 'SYSCAT'
AND     tabname   = 'TABLES'
ORDER BY
        colno
;
Liệt kê 9. Kết quả đầu ra mẫu của ví dụ 3
<ColName xmlns="www.ibm.com">TABSCHEMA</ColName>
<ColName xmlns="www.ibm.com">TABNAME</ColName>
<ColName xmlns="www.ibm.com">OWNER</ColName>
<ColName xmlns="www.ibm.com">TYPE</ColName>
<ColName xmlns="www.ibm.com">STATUS</ColName>
<ColName xmlns="www.ibm.com">BASE_TABSCHEMA</ColName>
<ColName xmlns="www.ibm.com">BASE_TABNAME</ColName>
<ColName xmlns="www.ibm.com">ROWTYPESCHEMA</ColName>
<ColName xmlns="www.ibm.com">ROWTYPENAME</ColName>
<ColName xmlns="www.ibm.com">CREATE_TIME</ColName>
<ColName xmlns="www.ibm.com">INVALIDATE_TIME</ColName>
<ColName xmlns="www.ibm.com">STATS_TIME</ColName>
<ColName xmlns="www.ibm.com">COLCOUNT</ColName>
<ColName xmlns="www.ibm.com">TABLEID</ColName>
<ColName xmlns="www.ibm.com">TBSPACEID</ColName>

Ví dụ 4: XMLELEMENT() với vùng tên

Liệt kê 10. Ví dụ 4 mã SQL
SELECT  XMLELEMENT
        (
          NAME "db2:ColName",
          XMLNAMESPACES ( 'www.ibm.com/db2' AS "db2" ),
          colname
        )
FROM
        syscat.columns
WHERE
        tabschema = 'SYSCAT'
AND     tabname   = 'TABLES'
ORDER BY
        colno
FETCH FIRST 15 ROWS ONLY
;
Liệt kê 11. Kết quả đầu ra mẫu của ví dụ 4
<db2:ColName xmlns:db2="www.ibm.com/db2">TABSCHEMA</db2:ColName>
<db2:ColName xmlns:db2="www.ibm.com/db2">TABNAME</db2:ColName>
<db2:ColName xmlns:db2="www.ibm.com/db2">OWNER</db2:ColName>
<db2:ColName xmlns:db2="www.ibm.com/db2">TYPE</db2:ColName>
<db2:ColName xmlns:db2="www.ibm.com/db2">STATUS</db2:ColName>
<db2:ColName xmlns:db2="www.ibm.com/db2">BASE_TABSCHEMA</db2:ColName>
<db2:ColName xmlns:db2="www.ibm.com/db2">BASE_TABNAME</db2:ColName>
<db2:ColName xmlns:db2="www.ibm.com/db2">ROWTYPESCHEMA</db2:ColName>
<db2:ColName xmlns:db2="www.ibm.com/db2">ROWTYPENAME</db2:ColName>
<db2:ColName xmlns:db2="www.ibm.com/db2">CREATE_TIME</db2:ColName>
<db2:ColName xmlns:db2="www.ibm.com/db2">INVALIDATE_TIME</db2:ColName>
<db2:ColName xmlns:db2="www.ibm.com/db2">STATS_TIME</db2:ColName>
<db2:ColName xmlns:db2="www.ibm.com/db2">COLCOUNT</db2:ColName>
<db2:ColName xmlns:db2="www.ibm.com/db2">TABLEID</db2:ColName>
<db2:ColName xmlns:db2="www.ibm.com/db2">TBSPACEID</db2:ColName>

Ví dụ 5: Các tùy chọn XMLELEMENT() dành cho NULL

Liệt kê 12. Ví dụ 5 mã SQL
SELECT  XMLELEMENT(NAME "Table", tabname),
        XMLELEMENT(NAME "TbSpc1",
          tbspace
          OPTION EMPTY ON NULL
        ),
        XMLELEMENT(NAME "TbSpc2",
          tbspace
          OPTION NULL ON NULL
        )
FROM
        syscat.tables
WHERE
        tbspace IS NULL
FETCH FIRST 15 ROWS ONLY
;
Liệt kê 13. Kết quả đầu ra mẫu của ví dụ 5
<Table>CHECK_CONSTRAINTS</Table>        <TbSpc1/> -
<Table>COLUMNS</Table>                  <TbSpc1/> -
<Table>COLUMNS_S</Table>                <TbSpc1/> -
<Table>REFERENTIAL_CONSTRAINTS</Table>  <TbSpc1/> -
<Table>REF_CONSTRAINTS</Table>          <TbSpc1/> -
<Table>TABLE_CONSTRAINTS</Table>        <TbSpc1/> -
<Table>TABLES</Table>                   <TbSpc1/> -
<Table>TABLES_S</Table>                 <TbSpc1/> -
<Table>USER_DEFINED_TYPES</Table>       <TbSpc1/> -
<Table>UDT_S</Table>                    <TbSpc1/> -
<Table>VIEWS</Table>                    <TbSpc1/> -
<Table>PARAMETERS</Table>               <TbSpc1/> -
<Table>PARAMETERS_S</Table>             <TbSpc1/> -
<Table>ROUTINES</Table>                 <TbSpc1/> -
<Table>ROUTINES_S</Table>               <TbSpc1/> -

Hàm vô hướng XMLFOREST()

Hàm XMLFOREST() tạo ra một loạt gồm một hoặc nhiều phần tử XML, được nối lại với nhau. Các sự khác nhau giữa XMLELEMENT()XMLFOREST() là:

  • Hàm XMLELEMENT() tạo ra chính xác một phần tử. Hàm XMLFOREST() có thể tạo bất kỳ số lượng các phần tử nào, được nối lại với nhau.
  • Cú pháp yêu cầu phải có tên của phần tử XML cho hàm XMLELEMENT(), nhưng có thể được mặc định cho hàm XMLFOREST() với các biểu thức SQL đơn giản. Điều này được chứng tỏ trong ví dụ bạn mà sẽ thấy sau đây.
  • Hàm XMLELEMENT() có thể tạo các thuộc tính; còn hàm XMLFOREST() thì không thể.

Hàm XMLFOREST() giống như một sự kết hợp của hàm XMLCONCAT() và hàm XMLELEMENT() ngoại trừ XMLFOREST() không thể chỉ rõ các thuộc tính. Nó là một cách rất thuận lợi để chỉ rõ một loạt các phần tử XML.

Ví dụ 6: XMLFOREST() (không có các vùng tên)

Trong ví dụ này, lưu ý rằng cả hai colnotypename chỉ rõ một tên cho một phần tử XML, trong khi colname thì không. Việc bỏ qua chúng làm cho tên giống như tên các cột, nhưng tất cả bằng chữ hoa.

Liệt kê 14. Ví dụ 6 mã SQL
SELECT  XMLFOREST(
          colno    AS "ColNum",
          colname,
          typename AS "DataType"
        )
FROM
        syscat.columns
WHERE
        tabschema = 'SYSCAT'
AND     tabname   = 'TABLES'
ORDER BY
        colno
FETCH FIRST 15 ROWS ONLY
;
Liệt kê 15. Kết quả đầu ra mẫu của ví dụ 6
<ColNum>0</ColNum><COLNAME>TABSCHEMA</COLNAME><DataType>VARCHAR</DataType>
<ColNum>1</ColNum><COLNAME>TABNAME</COLNAME><DataType>VARCHAR</DataType>
<ColNum>2</ColNum><COLNAME>OWNER</COLNAME><DataType>VARCHAR</DataType>
<ColNum>3</ColNum><COLNAME>TYPE</COLNAME><DataType>CHARACTER</DataType>
<ColNum>4</ColNum><COLNAME>STATUS</COLNAME><DataType>CHARACTER</DataType>
<ColNum>5</ColNum><COLNAME>BASE_TABSCHEMA</COLNAME><DataType>VARCHAR</DataType>
<ColNum>6</ColNum><COLNAME>BASE_TABNAME</COLNAME><DataType>VARCHAR</DataType>
<ColNum>7</ColNum><COLNAME>ROWTYPESCHEMA</COLNAME><DataType>VARCHAR</DataType>
<ColNum>8</ColNum><COLNAME>ROWTYPENAME</COLNAME><DataType>VARCHAR</DataType>
<ColNum>9</ColNum><COLNAME>CREATE_TIME</COLNAME><DataType>TIMESTAMP</DataType>
<ColNum>10</ColNum><COLNAME>INVALIDATE_TIME</COLNAME><DataType>TIMESTAMP</DataType>
<ColNum>11</ColNum><COLNAME>STATS_TIME</COLNAME><DataType>TIMESTAMP</DataType>
<ColNum>12</ColNum><COLNAME>COLCOUNT</COLNAME><DataType>SMALLINT</DataType>
<ColNum>13</ColNum><COLNAME>TABLEID</COLNAME><DataType>SMALLINT</DataType>
<ColNum>14</ColNum><COLNAME>TBSPACEID</COLNAME><DataType>SMALLINT</DataType>

Ví dụ 7: XMLELEMENT() (với các vùng tên mặc định)

Liệt kê 16. Ví dụ 7 mã SQL
SELECT  XMLFOREST(
          XMLNAMESPACES( DEFAULT 'www.ibm.com' ),
          colno    AS "ColNum",
          colname
        )
FROM
        syscat.columns
WHERE
        tabschema = 'SYSCAT'
AND     tabname   = 'TABLES'
ORDER BY
        colno
FETCH FIRST 15 ROWS ONLY
;

Liệt kê 17. Kết quả đầu ra mẫu của ví dụ 7

Ví dụ 8: XMLFOREST() với tùy chọn EMPTY ON NULL

Liệt kê 18. Ví dụ 8 mã SQL
SELECT  XMLFOREST(
          tabname AS "Table",
          tbspace AS "TbSpc"
          OPTION EMPTY ON NULL
        )
FROM
        syscat.tables
WHERE
        tbspace IS NULL
FETCH FIRST 15 ROWS ONLY
;
Liệt kê 19. Kết quả đầu ra mẫu của ví dụ 8
<Table>CHECK_CONSTRAINTS</Table><TbSpc/>
<Table>COLUMNS</Table><TbSpc/>
<Table>COLUMNS_S</Table><TbSpc/>
<Table>REFERENTIAL_CONSTRAINTS</Table><TbSpc/>
<Table>REF_CONSTRAINTS</Table><TbSpc/>
<Table>TABLE_CONSTRAINTS</Table><TbSpc/>
<Table>TABLES</Table><TbSpc/>
<Table>TABLES_S</Table><TbSpc/>
<Table>USER_DEFINED_TYPES</Table><TbSpc/>
<Table>UDT_S</Table><TbSpc/>
<Table>VIEWS</Table><TbSpc/>
<Table>PARAMETERS</Table><TbSpc/>
<Table>PARAMETERS_S</Table><TbSpc/>
<Table>ROUTINES</Table><TbSpc/>
<Table>ROUTINES_S</Table><TbSpc/>

Ví dụ 9: XMLFOREST() với tùy chọn NULL ON NULL

Liệt kê 20. Ví dụ 9 mã SQL
SELECT  XMLFOREST(
          tabname AS "Table",
          tbspace AS "TbSpc"
          OPTION NULL ON NULL
        )
FROM
        syscat.tables
WHERE
        tbspace IS NULL
FETCH FIRST 15 ROWS ONLY
;
Liệt kê 21. Kết quả đầu ra mẫu của ví dụ 9
<Table>CHECK_CONSTRAINTS</Table>
<Table>COLUMNS</Table>
<Table>COLUMNS_S</Table>
<Table>REFERENTIAL_CONSTRAINTS</Table>
<Table>REF_CONSTRAINTS</Table>
<Table>TABLE_CONSTRAINTS</Table>
<Table>TABLES</Table>
<Table>TABLES_S</Table>
<Table>USER_DEFINED_TYPES</Table>
<Table>UDT_S</Table>
<Table>VIEWS</Table>
<Table>PARAMETERS</Table>
<Table>PARAMETERS_S</Table>
<Table>ROUTINES</Table>
<Table>ROUTINES_S</Table>

Hàm vô hướng XMLCONCAT()

Hàm XMLCONCAT() nối hai hoặc nhiều phần tử XML với nhau. Điều này thậm chí bao gồm kết quả đầu ra từ các hàm như là XMLCOMMENT(), XMLTEXT()XMLPI(). Có ít nhất một số tình huống ở đó hàm XMLCONCAT() là rất có ích:

  • Khi làm đầu vào cho hàm XMLAGG(), vì nó chỉ chấp nhận một đối số.
  • Xây dựng các nút hỗn hợp (ví dụ, John <mi>Q</mi> Smith)

Ví dụ 10: XMLCONCAT() với nhiều XMLELEMENT()

Liệt kê 22. Ví dụ 10 mã SQL
SELECT  XMLCONCAT(
          XMLELEMENT(NAME "Name", indname),
          XMLELEMENT(NAME "NumCols", colcount),
          XMLELEMENT(NAME "Uniq", uniquerule)
        )
FROM
        syscat.indexes
FETCH FIRST 15 ROWS ONLY
;
Liệt kê 23. Kết quả đầu ra mẫu của ví dụ 10
<Name>INDTABLES01</Name><NumCols>2</NumCols><Uniq>U</Uniq>
<Name>INDTABLES02</Name><NumCols>1</NumCols><Uniq>D</Uniq>
<Name>INDTABLES03</Name><NumCols>1</NumCols><Uniq>D</Uniq>
<Name>INDTABLES04</Name><NumCols>1</NumCols><Uniq>D</Uniq>
<Name>INDTABLES05</Name><NumCols>4</NumCols><Uniq>U</Uniq>
<Name>INDTABLES06</Name><NumCols>2</NumCols><Uniq>D</Uniq>
<Name>INDTABLES07</Name><NumCols>2</NumCols><Uniq>D</Uniq>
<Name>INDTABLES08</Name><NumCols>1</NumCols><Uniq>D</Uniq>
<Name>INDCOLUMNS01</Name><NumCols>3</NumCols><Uniq>U</Uniq>
<Name>INDCOLUMNS02</Name><NumCols>2</NumCols><Uniq>D</Uniq>
<Name>INDCOLUMNS03</Name><NumCols>1</NumCols><Uniq>D</Uniq>
<Name>INDINDEXES01</Name><NumCols>2</NumCols><Uniq>U</Uniq>
<Name>INDINDEXES02</Name><NumCols>3</NumCols><Uniq>U</Uniq>
<Name>INDINDEXES03</Name><NumCols>2</NumCols><Uniq>D</Uniq>
<Name>INDINDEXES04</Name><NumCols>3</NumCols><Uniq>D</Uniq>

Ví dụ 11: sử dụng XMLCONCAT() để tạo một nút hỗn hợp

Liệt kê 24. Ví dụ 11 mã SQL
SELECT  XMLCONCAT(
          XMLELEMENT(NAME "Index", indname),
          XMLTEXT(' has '),
          XMLELEMENT(NAME "NumCols", colcount)
        )
FROM
        syscat.indexes
FETCH FIRST 15 ROWS ONLY
;
Liệt kê 25. Kết quả đầu ra mẫu của ví dụ 11
<Index>INDTABLES01</Index> has <NumCols>2</NumCols>
<Index>INDTABLES02</Index> has <NumCols>1</NumCols>
<Index>INDTABLES03</Index> has <NumCols>1</NumCols>
<Index>INDTABLES04</Index> has <NumCols>1</NumCols>
<Index>INDTABLES05</Index> has <NumCols>4</NumCols>
<Index>INDTABLES06</Index> has <NumCols>2</NumCols>
<Index>INDTABLES07</Index> has <NumCols>2</NumCols>
<Index>INDTABLES08</Index> has <NumCols>1</NumCols>
<Index>INDCOLUMNS01</Index> has <NumCols>3</NumCols>
<Index>INDCOLUMNS02</Index> has <NumCols>2</NumCols>
<Index>INDCOLUMNS03</Index> has <NumCols>1</NumCols>
<Index>INDINDEXES01</Index> has <NumCols>2</NumCols>
<Index>INDINDEXES02</Index> has <NumCols>3</NumCols>
<Index>INDINDEXES03</Index> has <NumCols>2</NumCols>
<Index>INDINDEXES04</Index> has <NumCols>3</NumCols>

Hàm vô hướng XMLAGG ()

Hàm XMLAGG() là một hàm gộp nhóm, giống như SUM(), MIN()MAX(). Nó nhận một biểu thức XML như là một đối số và, với mỗi nhóm các bản ghi, nó nối tất cả các giá trị lại với nhau. Có một mệnh đề ORDER BY tùy chọn. Hàm XMLAGG() rất có ích khi xây dựng lên các tài liệu XML phức tạp, có liên quan đến các mối quan hệ một - nhiều. Trong ví dụ tiếp sau, mỗi hàng của SYSCAT.INDEXES được kết hợp với nhiều hàng từ SYSCAT.INDEXCOLUSE. Nhiều mối quan hệ một - nhiều, lồng trong nhau có thể được hàm XMLAGG() xử lý khi chuyển đổi các dữ liệu quan hệ thành XML.

Ví dụ 12: XMLAGG()

Liệt kê 26. Ví dụ 12 mã SQL
WITH
t1 AS
(
  SELECT indschema,
         indname,
         colseq,
         XMLELEMENT(
           NAME "ColName",
           XMLATTRIBUTES(colseq AS "Seq"),
           colname
         ) AS xml_col
  FROM
         syscat.indexcoluse
),
t2 (indschema, indname, list_cols) AS
(
  SELECT indschema,
         indname,
         XMLAGG(xml_col ORDER BY colseq)
  FROM
         t1
  GROUP BY
         indschema,
         indname
)
SELECT  XMLELEMENT(
          NAME "Index",
          XMLATTRIBUTES(i.indname AS "Name"),
          t2.list_cols
        )
FROM
        syscat.indexes  I,
        t2              T2
WHERE
        i.colcount BETWEEN 2 AND 4
AND     t2.indschema = i.indschema
AND     t2.indname   = i.indname
FETCH FIRST 15 ROWS ONLY
;
Liệt kê 27. Kết quả đầu ra mẫu của ví dụ 12
Row #1:

<Index Name="ATM_UNIQ">
  <ColName Seq="1">SCHEMA</ColName>
  <ColName Seq="2">NAME</ColName><
</Index>

Row #2:

<Index Name="HI_OBJ_UNIQ">
  <ColName Seq="1">HI_ID</ColName>
  <ColName Seq="2">OBJ_NAME1</ColName>
  <ColName Seq="3">OBJ_NAME2</ColName>
  <ColName Seq="4">OBJ_NAME3</ColName>
</Index>

Row #3:

<Index Name="IMDTA00">
  <ColName Seq="1">TOWNER00</ColName>
  <ColName Seq="2">TASKNAME00</ColName>
</Index>

Row #4:

<Index Name="IMDTA03">
  <ColName Seq="1">TASKID00</ColName>
  <ColName Seq="2">SUFFIX00</ColName>
  <ColName Seq="3">MODIFIED00</ColName>
</Index>

Row #5:

<Index Name="IMDTA04">
  <ColName Seq="1">TASKID00</ColName>
  <ColName Seq="2">SUFFIX00</ColName>
</Index>

Chú ý về Ví dụ 12

  • Ví dụ này có thể theo một vài cách mã hóa khác nhau. Các biểu thức bảng chung đã được sử dụng để chia tách mã làm nhiều phần và hy vọng làm cho nó rõ ràng hơn. Các kỹ thuật mã hóa khác bao gồm việc lồng nhau nhiều mức của các hàm trong từng hàm khác và/hoặc việc sử dụng các truy vấn con; cả hai cách này đều sẽ khó đọc hơn.

  • Kết quả đầu ra mẫu đã được định dạng lại (thêm các thụt dòng và các ngắt dòng) cho rõ ràng hơn.

  • Ví dụ này chỉ minh họa một mối quan hệ một - nhiều, nhưng cũng có thể xử lý nhiều mối quan hệ một-nhiều.

  • Biểu thức bảng chung (CTE) đầu tiên, T1, nhận các dữ liệu chi tiết cho bảng con (INDEXCOLUSE).

  • Biểu thức bảng chung (CTE) thứ hai, T2, gộp nhóm các dữ liệu từ INDEXCOLUSE thành chỉ một hàng cho mỗi chỉ mục. Có thể thực hiện công việc của T1T2 cùng nhau trong một câu lệnh SELECT, bằng cách lồng XMLELEMENT() trong XMLAGG(). Việc đó sẽ có thể quản lý được, nhưng việc lồng nhau nhiều tầng các hàm làm cho câu lệnh nhanh chóng trở nên khó đọc và thật khó dóng cho đúng các cặp dấu ngoặc đơn.

  • Câu lệnh SELECT cuối cùng thực hiện phép nối INDEXES với dữ liệu gộp nhóm từ INDEXCOLUSE và bao bọc một phần tử XML xung quanh nó.

Hàm vô hướng XMLDOCUMENT()

Hàm XMLDOCUMENT() chuyển đổi một nút XML thành một tài liệu XML. Nút XML phải đúng khuôn dạng, mà chủ yếu có nghĩa là nó phải có chỉ một phần tử gốc. Các bảng với các cột kiểu XML luôn luôn có chứa các tài liệu XML đúng ngữ pháp và cú pháp. Hàm XMLQUERY() trả về các nút XML (không phải các tài liệu). Tình huống chính trong đó bạn sẽ cần hàm XMLDOCUMENT() là khi bạn đang chèn các kết quả của XMLQUERY() vào một bảng có một cột kiểu XML. Ví dụ 13 minh họa điều này.

Ví dụ 13: XMLDOCUMENT()

Liệt kê 28. Ví dụ 13 mã SQL
CREATE TABLE demo.table1
(
  key          INT,
  xml_col      XML
)
;
Liệt kê 29. Kết quả đầu ra mẫu của ví dụ 13
DB20000I  The SQL command completed successfully.
Liệt kê 30. Ví dụ 13 mã SQL
INSERT INTO demo.table1 VALUES(1, 
'<person><first>Joe</first><last>Smith</last></person>');
Liệt kê 31. Kết quả đầu ra mẫu của ví dụ 13
DB20000I  The SQL command completed successfully.
Liệt kê 32. Ví dụ 13 mã SQL
SELECT  XMLQUERY(
         '$d/person/first'
          PASSING xml_col AS "d"
        )
FROM
        demo.table1
WHERE
        key = 1
;
Liệt kê 33. Kết quả đầu ra mẫu của ví dụ 13
<first>Joe</first>
Liệt kê 34. Ví dụ 13 mã SQL
INSERT INTO demo.table1
SELECT  2,
        XMLQUERY(
          '$d/person/first'
          PASSING xml_col AS "d"
        )
FROM
        demo.table1
WHERE
        key = 1
;
Liệt kê 35. Kết quả đầu ra mẫu của ví dụ 13
DB21034E  The command was processed as an SQL statement because it was not a
valid Command Line Processor command.  During SQL processing it returned:
SQL20345N The XML value is not a well-formed document with a single root
element.  SQLSTATE=2200L
Liệt kê 36. Ví dụ 13 mã SQL
INSERT INTO demo.table1
SELECT  2,
        XMLDOCUMENT(
          XMLQUERY(
            '$d/person/first'
            PASSING xml_col AS "d"
          )
        )
FROM
        demo.table1
WHERE
        key = 1
;
Liệt kê 37. Kết quả đầu ra mẫu của ví dụ 13
DB20000I  The SQL command completed successfully.
Liệt kê 38. Ví dụ 13 mã SQL
SELECT * FROM demo.table1;
Liệt kê 39. Kết quả đầu ra mẫu của ví dụ 13
KEY  XML_COL
---- -------------------------------
  1  <person><first>Joe</first><last>Smith</last></person>
  2  <first>Joe</first>

Hàm vô hướng XMLTEXT()

Hàm XMLTEXT() tạo ra một nút văn bản. Ví dụ 11 ở trên giải thích sử dụng nó như thế nào. Mục đích chính của hàm này là để giúp tạo ra các nút kiểu hỗn hợp.

Hàm vô hướng XMLCOMMENT()

Hàm XMLCOMMENT() tạo ra một nút chú thích. Các lời chú thích là các chuỗi ký tự, có hai sự hạn chế:

  • Chúng không thể chứa hai dấu gạch ngang liền nhau (--)
  • Chúng có thể không kết thúc bằng một dấu gạch ngang (-)

Ví dụ 14: XMLCOMMENT() (hợp lệ)

Liệt kê 40. Ví dụ 14 mã SQL
SELECT  XMLCONCAT(
          XMLELEMENT(NAME "Dummy1", 1200),
          XMLCOMMENT('Some comment'),
          XMLELEMENT(NAME "Dummy2", 'hello')
        )
FROM
        sysibm.sysdummy1
;
Liệt kê 41. Kết quả đầu ra mẫu của ví dụ 14
<Dummy1>1200</Dummy1>
<!--Some comment-->
<Dummy2>hello</Dummy2>

Ví dụ 15: XMLCOMMENT() với hai dấu gạch ngang liền nhau không được phép (không hợp lệ)

Liệt kê 42. Ví dụ 15 mã SQL
SELECT  XMLCONCAT(
          XMLELEMENT(NAME "Dummy1", 1200),
          XMLCOMMENT('Bad -- comments'),
          XMLELEMENT(NAME "Dummy2", 'hello')
        )
FROM
        sysibm.sysdummy1
;
Liệt kê 43. Kết quả đầu ra mẫu của ví dụ 16
SQL20331N The XML comment value "Bad -- comments" is not valid.
SQLSTATE=2200S

Ví dụ 16: XMLCOMMENT() với dấu gạch ngang cuối cùng không được phép (không hợp lệ)

Liệt kê 44. Ví dụ 16 mã SQL
SELECT  XMLCONCAT(
          XMLELEMENT(NAME "Dummy1", 1200),
          XMLCOMMENT('Bad comments -'),
          XMLELEMENT(NAME "Dummy2", 'hello')
        )
FROM
        sysibm.sysdummy1
;
Liệt kê 45. Kết quả đầu ra mẫu của ví dụ 16
SQL20331N The XML comment value "Bad comments -" is not valid.  SQLSTATE=2200S

Hàm vô hướng XMLPI()

Hàm XMLPI() tạo ra một chỉ thị xử lý XML. Có một số hạn chế:

  • Tên PI có thể không phải là xml ở bất kỳ đâu, trong bất kỳ sự kết hợp chữ hoa và chữ thường nào.
  • Chuỗi ký tự không thể chứa ?> ở bất cứ đâu.

Ví dụ 17: XMLPI() (hợp lệ)

Liệt kê 46. Ví dụ 17 mã SQL
SELECT  XMLCONCAT(
          XMLELEMENT(NAME "Dummy1", 1200),
          XMLPI(NAME "ValidName", 'some string'),
          XMLELEMENT(NAME "Dummy2", 'hello')
        )
FROM
        sysibm.sysdummy1
;
Liệt kê 47. Kết quả đầu ra mẫu của ví dụ 17
<Dummy1>1200</Dummy1>
<?ValidName some string?>
<Dummy2>hello</Dummy2>

Ví dụ 18: XMLPI() với tên không hợp lệ (không hợp lệ)

Liệt kê 48. Ví dụ 18 mã SQL
SELECT  XMLCONCAT(
          XMLELEMENT(NAME "Dummy1", 1200),
          XMLPI(NAME "xmL", 'some string'),
          XMLELEMENT(NAME "Dummy2", 'hello')
        )
FROM
        sysibm.sysdummy1
;
Liệt kê 49. Kết quả đầu ra mẫu của ví dụ 18
SQL20275N  The XML name "xmL" is not valid. Reason code = "5".  SQLSTATE=42634

Ví dụ 19: XMLPI() với chuỗi ký tự không hợp lệ (không hợp lệ)

Liệt kê 50. Ví dụ 19 mã SQL
SELECT  XMLCONCAT(
          XMLELEMENT(NAME "Dummy1", 1200),
          XMLPI(NAME "Valid", 'bad ?> string'),
          XMLELEMENT(NAME "Dummy2", 'hello')
        )
FROM
        sysibm.sysdummy1
;
Liệt kê 51. Kết quả đầu ra mẫu của ví dụ 18
SQL20332N The XML processing instruction value "bad ?> string" is not valid.
SQLSTATE=2200T

Các nhiệm vụ về quản trị cơ sở dữ liệu (DBA) liên quan đến XML: các chỉ mục, các ràng buộc và các khung nhìn

Hướng dẫn thi lấy chứng chỉ DBA hiện không trình bày về các chỉ mục XML, do đó, các DBA có thể đến với bạn để trợ giúp lập chỉ mục các cột XML. Dưới đây là một số lời khuyên:

  • Xem "Common XML indexing issues" (Các vấn đề chung về chỉ mục XML) trong ở Trung tâm Thông tin DB2.

  • Các chỉ mục phải ít nhất cũng rộng như hay bao gồm được XPath trong truy vấn mà bạn muốn chạy nhanh hơn. Một XPath có sử dụng ký tự đại diện * hoặc // là rộng hơn một XPath có chỉ rõ đường dẫn chính xác đến nút mong muốn.

  • Các chỉ mục XML có thể là UNIQUE (duy nhất), nó là cách duy nhất để bắt tuân theo một ràng buộc UNIQUE. Cũng giống như với một chỉ mục quan hệ UNIQUE, tính duy nhất được tuân thủ trên toàn bộ bảng, không chỉ trong một tài liệu.

  • DB2 không hỗ trợ các chỉ mục XML phức hợp, nhưng bạn có thể khắc phục điều này bằng cách đặt những phần tử mong muốn trong một phần tử cha mẹ chung và tạo ra một chỉ mục XML trên phần tử cha mẹ như sau:

    <name>
        <family>Payne</family>
        <given>Donald</given>
        <middle>Edwin</middle>
    </name>

    Một chỉ mục theo tên (name) XPath sẽ lập chỉ mục văn bản ghép nối trong các phần tử con. Một cách khác là sử dụng trình DB2 Net Search Extender; Nó đã được tăng cường để hỗ trợ đầy đủ cho các cột XML, bao gồm các tìm kiếm gần giống và tìm kiếm dùng ký tự đại diện.

  • Không có cách trực tiếp nào để tạo ra một ràng buộc toàn vẹn tham chiếu trên dữ liệu XML; bạn có thể khắc phục điều này bằng cách băm nhỏ các trường được chọn vào các cột có trong bảng quan hệ, có các ràng buộc mong muốn.

  • Bạn có thể tạo ra một khung nhìn XML trên dữ liệu quan hệ với các hàm SQL/XML như XMLDOCUMENT(), XMLELEMENT(), v.v. Bạn cũng có thể tạo ra một khung nhìn quan hệ trên các dữ liệu XML, với XMLTABLE(). Tuy nhiên, thường là hiệu quả hơn khi truy vấn dữ liệu XML thông qua XQuery hoặc SQL XMLQUERY() và truy vấn dữ liệu quan hệ thông qua câu lệnh SQL SELECT. Nếu bạn truy vấn một khung nhìn XML trên các dữ liệu quan hệ, trình biên dịch (compiler) và trình tối ưu hóa (optimizer) truy vấn không thể tận dụng lợi ích của các chỉ mục quan hệ hoặc ngược lại.


Các cải tiến DB2 9 cho các nhà phát triển

DB2 9 bao gồm các cải tiến cho dữ liệu XML:

  • Các chương trình bổ sung (Add-Ins) về cơ sở dữ liệu cho Microsoft Visual Studio 2005.
  • DB2 Developer Workbench (DWB-Các bàn làm việc của nhà phát triển DB2).
  • Hỗ trợ SQL.

Các Add-Ins cơ sở dữ liệu cho Microsoft Visual Studio 2005 bao gồm các đặc tính dành cho XML:

  • Sử dụng một kiểu dữ liệu XML cho các cột và các thủ tục.
  • Cung cấp một chỉ mục XML cho một cột XML.
  • Có khả năng để quan sát trực quan dữ liệu XML.
  • Cập nhật, nhập khẩu và xuất khẩu các dữ liệu XML.
  • Xác nhận tính hợp lệ một cơ sở dữ liệu XML dựa vào một Lược đồ XML đã đăng ký.
  • Đăng ký và hủy đăng ký các lược đồ XML.
  • Tạo ra dữ liệu mẫu dựa trên một Lược đồ XML.
  • Tạo và đăng ký các lược đồ XML có chú thích.
  • Thi hành và quan sát trực quan các kịch bản lệnh XQuery và SQL/XML.
  • Áp dụng phép biến đổi XSLT đến XML để quan sát trực quan tùy chỉnh.

Xem phần Tài nguyên để tìm đường liên kết đến một hướng dẫn trên developerWorks về DWB và đọc bài viết trên Thông tin trực tuyến "Có gì mới cho V9.1: Các cải tiến cho Add-Ins cơ sở dữ liệu IBM cho Microsoft Visual Studio 2005" để biết chi tiết.


Các hành vi và các tùy chọn của DB2 Command Line Processor (CLP-Trình xử lý dòng lệnh DB2 )

Nếu bạn chạy CLP DB2 để tìm hiểu về pureXML, thì cần biết các hành vi của CLP sau đây và các tùy chọn CLP để thay đổi hành vi đó. Những vấn đề này không có khả năng xuất hiện trong kỳ thi, nhưng rất đáng nhắc đến trong hướng dẫn này, bởi vì hành vi này có thể làm cho bạn nghĩ sai về cách DB2 xử lý XML như thế nào.

  • CLP trả về XML từ một câu lệnh SELECT như là một cột ký tự 4 KB. Kết quả đầu ra XML ngắn sẽ được đệm thêm sau đuôi bằng các khoảng trống. Tiêu đề và bộ kết quả có thể cuộn trên màn hình.

  • CLP db2 không thể luôn luôn tuần tự hóa dữ liệu XML mà nó chèn thành công:

    C:\>chcp
    Active code page: 1252

    &#x3a3; là tham chiếu số của XML cho chữ cái Hy Lạp xích ma (Σ) viết hoa. CLP trả về một lỗi khi bạn chọn tài liệu XML này, cho dù trang mã của bạn là 1252 hoặc 437, mặc dù xích ma là một ký tự trong mã trang 437.

    C:\>db2 -v "insert into catalog values ('Ref3', '<sigma>&#x3a3;</sigma>')"
    insert into catalog values ('Ref3', '<sigma>&#x3a3;</sigma>')
    DB20000I  The SQL command completed successfully.
    
    
    C:\>db2 -x "select catlog from catalog where name = 'Ref3'"
    SQL0969N  There is no message text corresponding to SQL error "-20412" in the
    message file on this workstation.  The error was returned from module
    "SQLABOLB" with original tokens "".  SQLSTATE=2200W
    
    C:\>db2 ? 2200W
    SQLSTATE 2200W: An XML value contained data that could not be serialized.
    
    C:\>chcp 437
    Active code page: 437
    
    C:\>db2 -x "select catlog from catalog where name = 'Ref3'"
    SQL0969N  There is no message text corresponding to SQL error "-20412" in the
    message file on this workstation.  The error was returned from module
    "SQLABOLB" with original tokens "".  SQLSTATE=2200W

    Một ứng dụng JDBC có thể đọc dữ liệu XML này. Việc tuần tự hóa XML AS VARCHAR tránh được lỗi CLP, nhưng ký tự xích ma bị mất, được thay thế bằng ký tự cuối tệp tin DOS, đó là Control-Z, nó xuất hiện trên màn hình như là một hình hộp.

    C:\>db2 -x "select xmlserialize(catlog as varchar(90))
    from catalog where name = 'Ref3'"
    </sigma>[box]</sigma>
  • CLP thường loại bỏ bất kỳ khoảng trống nào có chứa một dấu dòng mới trong chuỗi ký tự bằng chữ đầu vào, thay thế nó bằng chỉ một khoảng trống. Hành vi này có thể che dấu việc xử lý khoảng trống trong phân tích cú pháp và xác nhận hợp lệ XML (xem phần trước của hướng dẫn này về chủ đề đó để biết thêm thông tin). Nó không phải là đặc thù cho XML, do đó CLP thực hiện thay thế này không chỉ cho khoảng trống ranh giới, mà còn cho bất kỳ chuỗi khoảng trống nào có chứa ít nhất một dấu dòng mới. CLP không thay đổi khoảng trống không chứa dấu dòng mới. Hai tùy chọn CLP, -n-q, thay đổi hành vi này.

    Để chứng minh, đây là một kịch bản lệnh SQL chèn một tài liệu XML. Văn bản trong tài liệu XML có khoảng trống theo sau nó; ví dụ, tiếp theo 1 khoảng trống + NL + 1 khoảng trống:, có một khoảng trống, một dòng mới và một khoảng trống. Trong các liệt kê mã lệnh và kết quả đầu ra dưới đây, một dấu đô la sẽ được hiển thị ở cuối của mỗi dòng để chỉ ra dòng kết thúc ở đâu và có khoảng trống ở đâu (giống như trong lệnh vi:%l). Một dòng phải được bẻ đôi làm hai dòng cho dễ đọc, kết thúc bằng một gạch chéo ngược (\) và tiếp tục ở dòng kế tiếp tại lề bên trái. Chuỗi khoảng trống dài đệm thêm kết quả XML đến 4 KB được bỏ qua.

    delete from catalog where name = 'foo';$
    insert into catalog (name, catlog) values ($
    'foo',$
    xmlparse(document '<a>1 space + NL + 1 space: $
     3 spaces:   NL:$
    </a>' preserve whitespace)$
    );$
    select catlog from catalog where name = 'foo';$

    Nếu bạn chạy kịch bản lệnh này mà không có tùy chọn -q hoặc -n, thì hành vi được mô tả xảy ra:

    C:\>db2 -xtvf testWhitespace.sql > testws-no_opts.txt
    delete from catalog where name = 'foo'$
    DB20000I  The SQL command completed successfully.$
    $
    insert into catalog (name, catlog) values ( 'foo', xmlparse(document \
    '<a>1 space + NL + 1 space: 3 spaces:   NL: </a>' preserve whitespace) )$
    DB20000I  The SQL command completed successfully.$
    $
    select catlog from catalog where name = 'foo'$
    <a>1 space + NL + 1 space: 3 spaces:   NL: </a>$
    • Một khoảng trống cộng với dấu dòng mới cộng với một khoảng trống đã được thay đổi thành một khoảng trống.
    • Ba khoảng trống không có bất kỳ các dấu dòng mới nào đã không được thay đổi.
    • Một dòng mới đã được thay đổi thành một khoảng trống.

    Nếu bạn chạy cùng kịch bản lệnh với -n, CLP loại bỏ các dấu dòng mới nhưng để nguyên không thay đổi bất kỳ khoảng trống nào kề bên các dấu dòng mới này:

    C:\>db2 -xntvf testWhitespace.sql > testws-n.txt
    
    delete from catalog where name = 'foo'$
    DB20000I  The SQL command completed successfully.$
    $
    insert into catalog (name, catlog) values ( 'foo', xmlparse(document \
    '<a>1 space + NL + 1 space:  3 spaces:   NL:</a>' preserve whitespace) )$
    DB20000I  The SQL command completed successfully.$
    $
    select catlog from catalog where name = 'foo'$
    <a>1 space + NL + 1 space:  3 spaces:   NL:</a>$
    $
    • Một khoảng trống cộng với dấu dòng mới cộng với một khoảng trống đã được thay đổi thành hai khoảng trống.
    • Ba khoảng trống mà không có bất kỳ dòng mới nào đã không được thay đổi, như trước.
    • Một dòng mới đã được gỡ bỏ.

    Với tùy chọn -q (mà nó ghi đè -n), CLP giữ lại tất cả khoảng trống chính xác như là vốn có:

    C:\>db2 -xqtvf testWhitespace.sql > testws-q.txt
    delete from catalog where name = 'foo'$
    DB20000I  The SQL command completed successfully.$
    $
    insert into catalog (name, catlog) values ( 'foo', xmlparse(document \
    '<a>1 space + NL + 1 space: $
     3 spaces:   NL:$
    </a>' preserve whitespace) )$
    DB20000I  The SQL command completed successfully.$
    $
    select catlog from catalog where name = 'foo'$
    <a>1 space + NL + 1 space: $
     3 spaces:   NL:$
    </a>$
    $

    Điều này rất quan trọng nếu bạn chèn XML "đẹp", chứa các dấu dòng mới hoặc chèn XML bằng hàm tường minh XMLPARSE() với đối số PRESERVE WHITESPACE để giữ lại khoảng trống ranh giới (xem phần trước của hướng dẫn này về chủ đề đó để biết thêm thông tin).

    Hành vi này ảnh hưởng đến các câu lệnh trong cùng kịch bản lệnh mẫu mà bạn có thể tìm thấy tại SQLLIB\samples\xml\db2sample_xml.db2 trong bản cài đặt DB2 của bạn. Kịch bản lệnh này chèn vào các bảng CUSTOMERPRODUCT bằng các mệnh đề XMLVALIDATE( XMLPARSE( DOCUMENT '...' PRESERVE WHITESPACE ) ). Nếu bạn chạy db2sample_XML.db2 mà không có -q, thì CLP loại bỏ hầu hết các khoảng trống trước khi nó đến được tới trình phân tích cú pháp XML.

  • Tùy chọn CLP -v dội lại nguyên văn câu lệnh trước khi thi hành. Điều này rất có ích để khẳng định SQL chính xác mà DB2 thực hiện -- ví dụ, để xác định xem liệu bạn có áp mã thoát cho các ký tự như các dấu nháy kép trên dòng lệnh hoặc sử dụng các tùy chọn -n hoặc -q.

  • Tùy chọn CLP -i "in đẹp" kết quả của một XQuery, với sự thụt dòng như sau:

    • Mỗi thẻ và mỗi nút văn bản đứng riêng trên một dòng của nó.
    • Mỗi thẻ bắt đầu dóng thẳng hàng chiều đứng với thẻ kết thúc tương ứng của nó.
    • Mỗi phần tử hay nút văn bản được thụt vào so với phần tử cha mẹ của nó.

    Để thực hiện điều này, CLP bổ sung thêm không chỉ các khoảng trống ranh giới mà còn cả khoảng trống tới các phần tử không rỗng. Tùy chọn này không có tác dụng trên một câu lệnh SQL SELECT: trong một câu lệnh SELECT bình thường, CLP trả về dữ liệu trong các cột với một chiều dài xác định và do đó phải trả về XML như là một chuỗi ký tự thông thường.

  • -x bỏ qua các tiêu đề cột, dòng với các dấu gạch ngang và thông báo số (các) bản ghi được chọn (number record(s) selected), giảm khối lượng đầu ra. CLP vẫn còn đệm thêm XML bằng các khoảng trống đến thành 4 KB với câu lệnh SELECT.

  • -d lấy ra và hiển thị các khai báo XML trong kết quả. Với Windows, thuộc tính encodingwindows-1252, bất kể trang mã hiện tại của bạn (thiết lập bằng lệnh CHCP). Nếu bạn chọn XML bằng hàm XMLSERIALIZE(column INCLUDING XMLDECLARATION), tùy chọn này không có tác dụng: DB2 tạo ra khai báo (với encoding="UTF-8"), chứ không phải là CLP. Tùy chọn -d, giống như mệnh đề INCLUDING XMLDECLARATION, hoạt động bất kể liệu XML được chèn ban đầu có một khai báo không: Khai báo được tạo ra, không phải lấy ra từ nơi lưu trữ.

  • -td<terminator> chỉ rõ một ký tự kết thúc (terminator) câu lệnh SQL khác với dấu chấm phẩy. Điều này là cần thiết khi chạy một XQuery có chứa một dấu chấm phẩy. Tùy thuộc vào nội dung của các truy vấn của bạn, các ký tự kết thúc khả dĩ bao gồm dấu pound (#), dấu huyền (`) và dấu mũ (^).

  • Bạn có thể làm giảm kích cỡ của dữ liệu mà CLP trả về từ một câu lệnh SELECT bằng cách thêm vào hàm tường minh XMLSERIALIZE() hoặc CAST() của kiểu cột AS a CHAR hay VARCHAR. Coi chừng việc này có thể thay đổi cách trong đó tài liệu được mã hoá.


Kết luận

Với hướng dẫn này, bạn đã học cách làm thế nào để thao tác dữ liệu XML trong DB2. Bây giờ bạn biết:

  • DB2 xử lý khoảng trống ranh giới ở đầu vào như thế nào.
  • DB2 xác định bảng mã của một tài liệu XML ở đầu vào và đầu ra như thế nào.
  • DB2 có thể xác nhận tính hợp lệ dữ liệu XML ở đầu vào như thế nào.
  • Làm thế nào để thi hành một XQuery hay Xpath và nhận biết các kết quả của nó.
  • Làm thế nào để phân rã, hoặc băm nhỏ, đầu vào XML thành các hàng trong bảng quan hệ.
  • Làm thế nào để xuất bản dữ liệu quan hệ như là dữ liệu XML.
  • Làm thế nào để xuất bản dữ liệu XML như là dữ liệu quan hệ.

Chúc may mắn với kỳ thi này!


Tải về

Mô tảTênKích thước
Sample JDBC, SQLdb2CertExamV9AppDevXmlSample.zip72KB

Tài nguyên

Học tập

  • DB2 9 Application Development exam 733 prep tutorial series: Xem các phần khác của loạt bài hướng dẫn này được thiết kế để để trợ giúp bạn chuẩn bị cho kỳ thi lấy chứng chỉ Phát triển ứng dụng của Họ DB2 9 (kỳ thi 733). Loạt bài hướng dẫn này dạy về tất cả các khía cạnh lập trình với DB2, bao gồm những thứ là chung cho dữ liệu XML và dữ liệu quan hệ thông thường. Danh sách đầy đủ của tất cả các hướng dẫn trong loạt này bao gồm:
    • Các đối tượng cơ sở dữ liệu và các phương pháp lập trình.
    • Thao tác dữ liệu.
    • Thao tác dữ liệu XML.
    • Lập trình SQL nhúng.
    • Lập trình ODBC/CLI.
    • Lập trình .NET.
    • Lập trình Java.
    • Lập trình nâng cao.
    • Các thường trình do người dùng định nghĩa.
  • DB2 9 Fundamentals certification prep tutorial series: Trước khi bạn tham dự kỳ thi lấy chỉ Phát triển ứng dụng DB2 9 (kỳ thi 733), bạn cần phải đã tham dự và vượt qua kỳ thi lấy chứng chỉ Cơ bản DB2 9 (kỳ thi 730). Sử dụng loạt bài gồm bảy hướng dẫn này để chuẩn bị cho kỳ thi đó; các chủ đề bao gồm:
    • Lập kế hoạch DB2.
    • An ninh DB2.
    • Truy cập dữ liệu DB2.
    • Làm việc với dữ liệu DB2.
    • Làm việc với các đối tượng DB2.
    • Đồng quy dữ liệu.
    • Giới thiệu Xquery.
  • Phát triển ứng dụng, DB2, Java: Trung tâm thông tin của IBM, "Các đặc tính đã lạc hậu và không được tiếp tục nữa", Phần "lập trình ứng dụng", mục "Trình điều khiển JDBC DB2 kiểu 2 đã lạc hậu" và "JDBC DB2 Kiểu 3 không được tiếp tục nữa"
  • XML: vùng XML trên developerWorks có hơn 800 bài viết. Ví dụ, một tìm kiếm trong vùng XML cho các từ "phân tích cú pháp khoảng trống" trả về 21 kết quả, "phân tích cú pháp mã hóa" trả lại 74 kết quả và "XQuery" có 101 kết quả.
  • DB2, XML: vùng quản trị thông tin trên developerWorks có hơn 100 bài viết và hướng dẫn có liên quan đến XML. Cũ nhất trong đó (khoảng 02.2006 hoặc cũ hơn) là về XML Extender cho DB2 7 và 8. Do DB2 9 giới thiệu rất nhiều các đặc tính XML mới, nên một số thông tin và lời khuyên trong những bài viết đó đã lỗi thời với DB2 9. Bạn có thể sắp xếp danh mục tìm kiếm bất kỳ theo thứ tự ngày tháng giảm dần để lấy ra các bài viết gần đây nhất đầu tiên. Một số tư liệu đề cập đến DB2 9 như là "DB2 Viper", tên mã của nó trước khi có bản phát hành trong 07.2006.
  • XPath, XQuery: "Hướng dẫn SQL và XQuery cho DB2 IBM, Phần 7: Nhập môn XML và XQuery" (developerWorks, 08.2006): Hãy đọc bài giới thiệu về pureXML và XQuery, viết các truy vấn XQuery để lấy ra các phần tử XML, lọc dữ liệu dựa trên các giá trị XML, chuyển đổi kết quả đầu ra XML, sử dụng các mệnh đề khác nhau để lựa chọn các dữ liệu chính xác hơn và trộn XQuery và SQL.
  • SQL/XML: "Query DB2 XML data with SQL" (developerWorks, 03.2006): Tìm hiểu làm thế nào để truy vấn dữ liệu được lưu trữ trong các cột XML bằng cách sử dụng SQL và SQL/XML, với các ví dụ về XMLQUERY()XMLEXISTS().
  • XML: "XML Tutorial" (W3Schools): Tìm hiểu những khái niệm cơ bản về XML và tìm ra các đường liên kết tới các hướng dẫn khác về XQuery, Lược đồ XML và v.v. Tiếp theo là một số trang có liên quan đến hướng dẫn developerWorks này
  • XPath, XQuery, XSL, XSLT, XML Schema: XML Related Technologies page (W3Schools): Tìm các đường liên kết đến các hướng dẫn về XPath, XQuery, XSL, XSLT và XSD.
  • Phát triển ứng dụng, DB2, XML, XPath, XQuery: IBM cung cấp các chứng chỉ chuyên nghiệp như IBM Certified Solution Developer - XML 1.1 and Related Technologies (Nhà phát triển giải pháp được IBM công nhận - XML 1.1 và các công nghệ liên quan). Dưới mục "Các tài nguyên đào tạo", có các đường liên kết đến nhiều tài liệu tự học để giúp bạn chuẩn bị cho các kỳ thi lấy chứng chỉ, bao gồm cả một số tài liệu về các đặc tính XQuery và pureXML của DB2.
  • Bảng mã: XML Encoding page (W3Schools): Xem một số ví dụ về các vấn đề trong bảng mã của tài liệu. Lưu ý: Ở đâu nói tới các ký tự "nước ngoài", đó có nghĩa là "không phải là Tiếng Anh" hoặc "không phải mã ASCII".
  • Bảng mã: Thông tin trực tuyến DB2, Unicode character encoding: Bạn sẽ thấy một bài giới thiệu ngắn về Unicode và các bảng mã của nó (UCS-2, UTF-8, UTF-16).
  • Bảng mã: Thông tin trực tuyến DB2, việc triển khai thực hiện mã Unicode trong cơ sở dữ liệu DB2 cho Linux, UNIX, và Windows:
  • Bảng mã: Thông tin trực tuyến DB2, nhập vào các chữ Unicode.
  • Bảng mã: Unicode.org:
  • Bảng mã: mã JavaScript chuyển đổi các điểm mã Unicode thành UTF-8.
  • Bảng mã: Các tên của bộ ký tự chính thức được IANA (Internet Assigned Numbers Authority) duy trì và được liệt kê ở http://www.iana.org/assignments/character-sets.
  • Bảng mã: Các bộ ký tự và các trang mã:
  • Bảng mã: IBM toàn cầu hóa trang web kinh doanh theo yêu cầu của bạn: Tìm hiểu về các thành phần quốc tế cho Unicode (ICU), "thư viện hàng đầu cho việc quốc tế hóa phần mềm". Trang này bao gồm các biểu đồ mã, các trình diễn và mã có thể tải về bằng C, Java và JNI (Java Native Interface) với các thành phần để thao tác Unicode.
  • Bảng mã:Bộ ký tự của tài liệu (w3.org, Biểu diễn tài liệu HTML): xem làm thế nào để định rõ bảng mã ký tự của một tài liệu HTML và làm cách nào để biểu diễn các ký tự bên ngoài bảng mã này với các tham chiếu ký tự.
  • XML, Bảng mã, khoảng trống: Hiệp hội Web toàn thế giới (W3C hoặc w3.org): Extensible Markup Language (XML) 1.0 (Fourth Edition). Tiêu chuẩn XML. Các phần có liên quan đến hướng dẫn này bao gồm:

  • Xác nhận hợp lệ, Khoảng trống: Thông tin trực tuyến DB2, Xác nhận hợp lệ XML.

  • Bảng mã: Unicode cho các lập trình viên (dự thảo), bao gồm mã Unicode trong Java: Xem làm thế nào để viết các dữ liệu bằng chữ Unicode trong Java; chỉ rõ bảng mã, cả của mã nguồn (cho trình biên dịch) lẫn của các tệp dữ liệu và các chuỗi ký tự (cho các phương thức khác nhau để đọc, viết, chuyển đổi và xử lý); đọc và viết mã Unicode; và chọn các phương pháp để đọc và ghi các dữ liệu mã Unicode.
  • DB2, XML: "DB2 9 pureXML Guide" (IBM Redbook, 01.2007): Chương 6 là "Phát triển ứng dụng ". Nội dung chồng chéo với tài liệu hướng dẫn trực tuyến của Trung tâm thông tin DB2, nhưng quyển Sách Đỏ này tập hợp thuận tiện các thông tin liên quan đến XML vào một chỗ.
  • DB2, XML, Bảng mã: Ấn phẩm của IBM - Hướng dẫn XML DB2 9.1 (Mã tài liệu SC10-4254, 16.08.2006), có trong Trung tâm các ấn phẩm của IBM. Chọn quốc gia; chọn Search for publications (tìm kiếm các ấn phẩm); tìm kiếm theo số ấn phẩm SC10-4254. Bạn có thể đặt hàng một bản in hoặc tải xuống một tệp tin PDF. Chương 7 là "Phát triển ứng dụng", trong đó mô tả hầu hết cùng các tư liệu như là quyển Sách Đỏ "Hướng dẫn pureXML DB2 9". Các quyển Sách Đỏ là mới hơn, nhưng chỉ có tài liệu này trình bày Bảng mã XML, trong Chương 8
  • DB2, Phát triển ứng dụng: "DB2 Express-C: The Developer Handbook for XML, PHP, C/C++, Java, and .NET" (IBM Redbook, 09. 2006): Tìm hiểu các khái niệm cơ bản về phát triển ứng dụng DB2 với DB2 Express-C. Chương 2 là "Phát triển ứng dụng với pureXML DB2".
  • DB2, XQuery: "DB2 Developer Workbench, Part 3: Developer Workbench and XML" (developerWorks, 12. 2006): Tìm hiểu tài nguyên DWB, các phối cảnh, các khung nhìn, các trình soạn thảo và các thủ thuật hỗ trợ bạn để làm việc với chức năng XML trong DWB như thế nào.
  • DB2: Hướng dẫn: "Create XML-based stored procedures using the DB2 Developer Workbench" (developerWorks, 08.2006): Tạo một thủ tục được lưu sẵn để lấy ra dữ liệu XML bằng cách sử dụng bàn làm việc của nhà phát triển IBM DB2 9. Hãy xem xét DWB DB2 cung cấp một môi trường phát triển toàn diện cho việc tạo, chỉnh sửa, gỡ lỗi, triển khai và kiểm thử các thủ tục được lưu sẵn của DB2 như thế nào.
  • DB2, DBA, Đánh chỉ mục: Trung tâm thông tin DB2, Common XML indexing issues.
  • Duyệt qua kho sách công nghệ với các sách về các chủ đề kỹ thuật này và khác.

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

  • DB2 Express-C: Tải xuống phiên bản miễn phí của DB2 Express Edition for the community (Ấn bản Express DB2 cho cộng đồng) có cung cấp cùng các đặc tính dữ liệu cốt lõi như DB2 Express Edition (Ấn bản Express DB2) 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.
  • Phát triển ứng dụng: Microsoft Visual C++ Express: Tải về trình biên dịch C miễn phí. Để viết các ứng dụng Win32 (đối lập với .NET), bạn cần phải tải về và cài đặt Visual C++ 2005 Express Edition with the Microsoft Platform SDK.
  • Phát triển ứng dụng: Cygwin: Tải về môi trường kiểu Linux miễn phí cho Windows bao gồm một trình bao (shell).
  • Phát triển ứng dụng: Vim ("VI Improved"): Tải về một trình soạn thảo thiện nguyện giống như vi. Các màu sắc VIM và mã thụt dòng tự động, bao gồm XML, có thể làm cho nó dễ đọc, viết và phát hiện ra lỗi hơn.
  • Tải về phần mềm dùng thử IBM và thực hành các công cụ phát triển ứng dụng và sản phẩm phần mềm trung gian từ DB2®, Lotus®, Rational®, Tivoli® và WebSphere®.

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, Nguồn mở
ArticleID=435679
ArticleTitle=Chuẩn bị cho kỳ thi 733 về Phát triển ứng dụng DB2 9, Phần 3: Thao tác dữ liệu XML
publish-date=10132009