Bài viết này hướng dẫn cho bạn hỗ trợ XQuery của DB2, giải thích vài khái niệm ngôn ngữ cơ bản và chỉ ra bạn có thể viết và thực hiện các câu truy vấn XQuery đơn giản đối với dữ liệu XML
Trang 1Chuẩn bị cho kỳ thi 730 cơ bản về DB2 9, Phần 7: Giới thiệu về XQuery
C M Saracco, Kỹ sư phần mềm, IBM 硅谷实验室
Tóm tắt: Các đặc tính DB2® 9 hỗ trợ cho XQuery, một ngôn ngữ chuẩn công
nghiệp được thiết kế cốt để cho việc truy vấn dữ liệu XML Với XQuery và DB2
9, bạn có thể lấy toàn bộ các tài liệu XML hoặc các phân đoạn XML đã lưu trữ trong các cột XML Bạn cũng có thể chỉ rõ các bộ lọc dựa trên XML cho các truy vấn, chuyển đổi đầu ra XML và kết hợp các điều kiện logic vào các truy vấn Bài viết này hướng dẫn cho bạn hỗ trợ XQuery của DB2, giải thích vài khái niệm ngôn ngữ cơ bản và chỉ ra bạn có thể viết và thực hiện các câu truy vấn XQuery đơn giản đối với dữ liệu XML đã lưu trữ trên DB2 như thế nào Đây là bài viết thứ bẩy trong loạt bẩy bài viết giúp bạn chuẩn bị cho bài thi 730 cơ bản về DB2 9
Trước khi bạn bắt đầu
Để giúp bạn chuẩn bị cho các bài thi lấy chứng chỉ DB2, bài viết này giới thiệu cho bạn về XQuery và những hỗ trợ của nó trong DB2 Bạn nên làm quen với DB2 9 và hỗ trợ pureXML của nó trước khi đọc bài viết này
Bài viết này tập trung vào việc sử dụng XQuery để truy vấn dữ liệu DB2 XML Bài viết đưa ra một thảo luận hạn chế về việc sử dụng SQL/XML (SQL với những
mở rộng XML) để truy vấn dữ liệu DB2 XML Để tìm hiểu kỹ hơn về những hỗ trợ của DB2 cho các hàm SQL/XML theo chuẩn kỹ nghệ, xem Tài nguyên
Về loạt bài viết này
Bạn đang muốn thi lấy chứng chỉ cơ bản về DB2 (Bài thi 730)? Nếu đúng, bạn đã tìm đúng nơi để học rồi đấy Loạt bài này nằm trong loạt bẩy bài viết chuẩn bị thi chứng chỉ DB2 bao hàm tất cả kiến thức cơ bản các chủ đề bạn cần nắm được
Trang 2trước khi đọc câu hỏi thi đầu tiên Thậm chí, nếu bạn không có ý định thi lấy chứng chỉ ngay bây giờ, thì tập hợp bài viết này vẫn sẽ là một kho tài nguyên hữu ích để bắt đầu học và tìm hiểu xem có những gì mới trong DB2 9
Về bài viết này
Bài viết này khảo sát các khả năng cơ bản hỗ trợ XQuery mới của DB2 Ngoài ra, bài viết cũng phân tích những khác biệt chính giữa XQuery và SQL, khảo sát XPath và biểu thức "FLWOR", và hướng dẫn bạn cách để viết các XQuery đơn giản trên dữ liệu XML
Bài viết này hướng tới những người sử dụng DB2 có ý định làm việc với tài liệu XML được lưu trữ trong các cấu trúc phân cấp dưới dạng các cột của các bảng DB2 Tài liệu trong bài viết này bao trùm các chủ đề đã được đề cập tới trong phần
1, 4 và 5 của bài thi Bạn có thể tìm hiểu về các mục tiêu này tại: 03.ibm.com/certify/tests/obj730.shtml Bạn nên làm quen với các kỹ nghệ XML
http://www-cơ bản và hỗ trợ pureXML mới của DB2 trước khi đọc bài viết này Nếu cần thiết, bạn có thể xem thêm Tài nguyên để có những hiểu biết cơ bản về vấn đề này
Các mục tiêu
Sau khi hoàn thành bài học này, bạn có thể:
Hiểu được những khái niệm XQuery cơ bản
Trang 3 Viết những câu XQuery đơn giản sử dụng một vài biểu thức điển hình
Các điều kiện tiên quyết
Bài viết này dành cho những người đã từng làm quen với công nghệ XML cơ bản
và khả năng hỗ trợ mới của DB2 để quản lý dữ liệu và lưu trữ pureXML Bạn cần
có hiểu biết cơ bản về tính chất phân cấp của các tài liệu XML, khái niệm định dạng đúng (well-formedness), và cách sử dụng các phần tử, các thuộc tính như thế nào Bạn cũng cần hiểu cách lưu trữ các tài liệu XML định dạng dúng đó trong cấu trúc phân cấp vốn có sử dụng DB2 9
Tổng quan về XQuery
Trang 4DB2 9 có khả năng hỗ trợ XQuery, một ngôn ngữ truy vấn mới được thiết kế chuyên dụng khi thao tác với dữ liệu XML Là một phần của chuẩn kỹ nghệ W3C, XQuery cho phép người dùng duyệt cấu trúc phân cấp trong tài liệu XML Kết quả
là, bạn có thể truy vấn các tài liệu XML hoặc các phân đoạn tài liệu sử dụng
XQuery Bạn cũng có thể viết các câu XQuery có chứa các vị từ dựa trên XML để lọc ra dữ liệu không mong muốn từ những kết quả mà DB2 sẽ trả về XQuery hỗ trợ nhiều khả năng như khả năng biến đổi đầu ra XML và kết hợp logic điều kiện vào các truy vấn
Trước khi học cách sử dụng XQuery như thế nào, bạn cần hiểu vài khái niệm cơ bản về ngôn ngữ
Cơ bản về XQuery
Một XQuery luôn biến đổi từ một giá trị của mô hình dữ liệu XQuery này
(XQuery Data Model) sang một giá trị của một mô hình dữ liệu XQuery khác Một giá trị trong mô hình dữ liệu XQuery là một chuỗi gồm không hoặc nhiều hơn một danh mục (item) Một danh mục có thể là:
Giá trị nguyên tử bất kì
Một nút XML như phần tử (element), thuộc tính (attribute) hoặc nút văn bản (text node) (đôi khi được gọi là một phân đoạn tài liệu XML)
Một tài liệu XML đầy đủ
Thường thì đầu vào một XQuery là một tập hợp các tài liệu XML
Ví dụ 1 biểu diễn một tài liệu XML có chứa 8 nút phần tử, một nút thuộc tính và sáu nút văn bản Các nút phần tử được biểu diễn bằng các thẻ phần tử Các phần tử Client, Address, street, city, state, zip và hai phần tử email được gọi là các nút phần tử trong tài liệu này Nếu để ý kỹ phần tử Client, bạn sẽ thấy rằng nó chứa
Trang 5một nút thuộc tính là id của Client đó Một số nút phần tử của tài liệu có các nút văn bản đi kèm Ví dụ, nút văn bản cho phần tử city là San Jose
Ví dụ 1 Một tài liệu XML mẫu
Trang 6Hình 1 Phần tử, thuộc tính, và các nút văn bản trong một tài liệu XML mẫu
Ngôn ngữ XQuery suy ra từ các chuẩn khác của XML, chẳng hạn như XPath Nó xác định những người dùng có thể duyệt qua một tài liệu XML và lược đồ XML như thế nào, nó chỉ rõ các kiểu dữ liệu và các cấu trúc hợp lệ cho các tài liệu của
họ Bạn sẽ học cách kết hợp các biểu thức XPath vào các XQuery trong bài viết này
XQuery cung cấp các loại biểu thức khác nhau mà bạn có thể kết hợp với nhau theo cách mà bạn muốn Mỗi biểu thức trả về một chuỗi các giá trị mà chúng được dùng như là đầu vào cho các biểu thức khác Kết quả của biểu thức ngoài cùng là kết quả của truy vấn
Bài viết này thảo luận hai loại biểu thức XQuery quan trọng
Biểu thức đường dẫn
Cho phép người dùng trình duyệt hoặc "khám phá" cấu trúc phân cấp của một tài liệu XML và trả về các nút được tìm thấy khi kết thúc đường dẫn
Trang 7Biểu thức FLWOR
Rất giống với biểu thức SELECT-FROM-WHERE trong SQL Nó được dùng để thực hiện phép lặp trên một chuỗi các danh mục và trả về một vài kết quả nào đó được tính toán từ mỗi danh mục
XQuery khác với SQL như thế nào
Nhiều người dùng SQL nhận thức sai lầm rằng XQuery rất giống với SQL Tuy nhiên, XQuery khác SQL ở rất nhiều điểm lớn bởi vì ngôn ngữ này được thiết kế
để thao tác với các mô hình dữ liệu có nhiều đặc trưng khác biệt Các tài liệu XML
có cấu trúc phân cấp và có tính chất thứ bậc Ngược lại, các bảng biểu được hỗ trợ trong hệ quản trị cơ sở dữ liệu (DBMS) quan hệ (nói chính xác hơn là DBMS dựa trên SQL) là cấu trúc phẳng và dựa trên tập hợp, do đó các bản ghi là không có thứ
tự
Những sự khác biệt này trong các mô hình dữ liệu dẫn tới sự khác biệt quan trọng trong các ngôn ngữ truy vấn được thiết kế để hỗ trợ mô hình đó Ví dụ, XQuery cho phép người lập trình duyệt trên cấu trúc phân cấp của tài liệu XML SQL phẳng (không có các mở rộng XML) không có hoặc không cần thiết các biểu thức tương ứng để duyệt trên cấu trúc dữ liệu bảng biểu như vậy XQuery hỗ trợ
cả hai loại dữ liệu có kiểu và không có kiểu, trong khi dữ liệu SQL luôn luôn phải được định kiểu rõ ràng
Đây chỉ là một vài sự khác biệt giữa XQuery và SQL Việc cung cấp một danh sách đầy đủ những sự khác biệt giữa hai ngôn ngữ nằm ngoài phạm vi của bài viết
Trang 8có tính chất giới thiệu này, nhưng phần Tài nguyên sẽ cung cấp thêm thông tin về chủ đề này
XQuery không có giá trị null bởi vì các tài liệu XML bỏ qua dữ liệu thiếu hoặc dữ liệu không biết SQL lại sử dụng giá trị null để biểu diễn những dữ liệu dạng đó XQuery trả về một chuỗi dữ liệu XML; trong khi SQL trả về kết quả là các tập hợp các kiểu dữ liệu SQL khác nhau Điểm cuối cùng đó là, XQuery hoạt động trên các kiểu XML trong khi SQL hoạt động trên các cột được định kiểu SQL truyền thống, và SQL/XML (SQL có các mở rộng XML) hoạt động trên cả dữ liệu XML và các kiểu dữ liệu SQL truyền thống
Các biểu thức đường dẫn trong XQuery
XQuery hỗ trợ các biểu thức XPath cho phép người dùng trình duyệt một cấu trúc phân cấp tài liệu XML để xác định vị trí của các phần quan trọng Phần thảo luận
về XPath một cách chi tiết nằm ngoài phạm vi của bài viết này nhưng chúng ta sẽ xem xét một vài ví dụ đơn giản ở đây
Các biểu thức XPath rất giống với các biểu thức mà bạn sử dụng khi làm việc với một hệ thống tệp máy tính truyền thống Hãy xem cách trình duyệt các thư mục Unix và Windows, bạn sẽ có một ý tưởng về cách bạn trình duyệt một tài liệu XML sử dụng XPath
Một biểu thức đường dẫn trong XQuery có chứa một loạt các bước được ngăn cách bằng các kí tự gạch chéo Trong cấu trúc đơn giản nhất của nó, mỗi bước duyệt xuống trên cấu trúc phân cấp XML tìm ra các phần tử con của nó được trả
về từ bước trước Mỗi bước trong biểu thức đường dẫn cũng có thể chứa một vị từ
Trang 9để lọc ra các phần tử được trả về ở bước đó, chỉ giữ lại các phần tử thỏa điều kiện Bạn sẽ xem một ví dụ của trường hợp đó ngay bây giờ
Một nhiệm vụ phổ biến liên quan đến việc duyệt từ gốc tài liệu XML (mức đỉnh của cây phân cấp XML) đến một nút quan tâm Ví dụ, để lấy các phần tử email trong tài liệu trình bày trong ví dụ 2 dưới đây, bạn có thể viết:
Trang 10Biểu thức đường dẫn này duyệt phần tử email đầu tiên với điều kiện phần tử Client
Ví dụ 5 Lọc trên một giá trị phần tử
/Client/Address[state="CA"]/zip
Bạn cũng có thể dùng dấu sao ("*") để tham chiếu nút bất kì ở từng bước riêng của biểu thức đường dẫn Ví dụ sau trả về phần tử city bất kì tìm thấy dưới nút con gần nhất bất kì của phần tử Client
Ví dụ 6 Sử dụng dấu sao (*)
Trang 11Ví dụ 8 biểu diễn vài ví dụ về các kiểu khác nhau của các biểu thức đường dẫn
Ví dụ 8 Các biểu thức đường dẫn và nghĩa của chúng
//* (Retrieves all nodes in the document)
//email (Finds email elements anywhere in the document)
Trang 12/Client/email[1]/text() (Retrieves the text node of the first email element
beneath the Client element)
/Client/Address/* (Selects all child nodes of the Address sub-element of
root Client element)
/Client/data(@id) (Returns the value of the id attribute of the Client
Chú ý rằng XPath là cấu trúc động Bạn ghi nhớ điều quan trọng này khi viết
XQuery, trong đó nó biểu diễn những trường hợp khác mà XQuery khác với SQL
Trang 13Ví dụ, nếu bạn kết hợp biểu thức đường dẫn "/client/address" vào câu XQuery của bạn, bạn không nhận được bất kì kết quả nào với tài liệu mẫu đã cho trong Ví dụ
1
Các biểu thức FLWOR trong XQuery
Mọi người thường dùng các biểu thức FLWOR trong XQuery Giống như khối SELECT-FROM-WHERE trong SQL, một biểu thức FLWOR của XQuery có thể chứa nhiều mệnh đề được xác định bằng các từ khóa Các mệnh đề của một biểu thức FLWOR bắt đầu bằng các từ khóa dưới đây:
for: Lặp trên một chuỗi đầu vào, liên kết lần lượt một biến với mỗi danh mục (item) đầu vào
let: Khai báo một biến và gán cho nó một giá trị, có thể là một danh sách các mục
where: Xác định điều kiện để lọc các kết quả truy vấn
order by: Xác định trật tự sắp xếp kết quả
return: Xác định kết quả được trả về
Hãy xem lại mỗi từ khóa một lúc Chúng ta sẽ thảo luận về mệnh đề for và return đồng thời, vì vậy bạn có thể quan sát một ví dụ đầy đủ (Không có mệnh đề return, biểu thức sẽ không đầy đủ.)
for và return
Trang 14Các từ khóa for và return thường sử dụng lặp qua một chuỗi các giá trị và trả về kết quả nào đó cho mỗi giá trị Sau đây là một ví dụ rất đơn giản:
for $i in (1, 2, 3)
return $i
Trong XQuery, các tên biến được thêm một dấu ("$") đằng trước Vì vậy ví
dụ trên gán các giá trị 1, 2, 3 vào biến $i ở mỗi lần lặp, và trả về mỗi giá trị cho $i trong mỗi lần lặp đó Kết quả của biểu thức là một chuỗi ba giá trị:
Trang 15Một ví dụ giúp cho việc phân biệt rõ ràng hơn Xem biểu thức sau, nó sử dụng từ khóa for và chú ý tới đầu ra được trả về:
tử đầu ra, mỗi cái một giá trị khác nhau
Bây giờ hãy xem một biểu thức tương tự sử dụng từ khóa let:
let $i := (1, 2, 3)
Trang 16return <output>{$i}</output>
<output>1 2 3</output>
Kết quả tương đối khác Nó chứa một phần tử đầu ra đơn với giá trị "1 2 3"
Hai ví dụ này minh họa điều quan trọng cần ghi nhớ là: từ khóa for lặp qua các mục trong một chuỗi đầu vào ở mỗi lần lặp thì gán cho chúng mỗi biến
cụ thể Ngược lại, từ khóa let gán tất cả các mục trong chuỗi đầu vào một lần một biến cụ thể
where
Trong XQuery, các hàm where rất giống với mệnh đề WHERE trong SQL:
nó cho phép bạn áp dụng các điều kiện lọc trên truy vấn của mình Xem ví
dụ sau đây:
for $i in (1, 2, 3)
where $i < 3
return <output>{$i}</output>
Trang 18ưu tốt các truy vấn này
Trang 19Để thực hiện trực tiếp một truy vấn XQuery trong DB2, bạn phải viết phần mở đầu cho truy vấn bằng từ khóa xquery Điều này chỉ cho DB2 gọi ra bộ phân tích cú pháp XQuery của nó để xử lý yêu cầu của bạn Bạn chỉ cần làm như vậy nếu bạn
sử dụng XQuery như là một ngôn ngữ ngoài cùng (hoặc mức đỉnh) Nếu bạn nhúng các biểu thức XQuery vào SQL, bạn không cần viết phần mở đầu của truy vấn bằng từ khóa xquery
Trong bài viết này, bạn sẽ sử dụng XQuery như là một ngôn ngữ chính vì vậy tất
cả các truy vấn được trình bày ở đây sẽ được viết với phần mở đầu bằng xquery
Môi trường cơ sở dữ liệu mẫu
Để giúp bạn học XQuery, bài viết này đưa ra một bảng "clients" mẫu có chứa một vài tài liệu XML Các đoạn tiếp theo giải thích chi tiết hơn về bảng này và nội dung của nó, mô tả những tiện ích mà DB2 cung cấp để bạn có thể sử dụng viết các câu XQuery
Nếu bạn muốn cài đặt hệ thống DB2 của mình có chứa các nội dung và bảng mẫu thì một kịch bản sẵn có là tutorial.sql Nó chứa tất cả các mã trình bày trong phần này
Bảng mẫu
Bảng "clients" trong các ví dụ của chúng ta có chứa các cột dựa trên các kiểu dữ liệu SQL truyền thống (chẳng hạn như số nguyên và các xâu kí tự độ dài khác nhau), và một cột dựa trên kiểu dữ liệu SQL mới là "XML"
Ba cột đầu tiên ghi thông tin về các ID, tên (name) và trạng thái (status) của các khách hàng (Client) Các giá trị điển hình cho cột status bao gồm Gold, Silver, và Standard Cột thứ tư chứa mỗi thông tin liên lạc của khách hàng, chẳng hạn như
Trang 20địa chỉ hộp thư nhà riêng (home mailing address), số điện thoại (phone numbers), địa chỉ email (email addresses), v.v Các thông tin như thế được lưu trữ trong các tài liệu XML đã cấu trúc
Bảng "Clients" được định nghĩa như thế nào:
Ví dụ 9 Định nghĩa bảng Clients
create table clients(
id int primary key not null,
name varchar(50),
status varchar(10),
contactinfo xml
);
Các tài liệu XML mẫu
Trước khi khảo sát viết các câu XQuery như thế nào với bảng này, bạn cần đưa những dữ liệu mẫu vào nó Các câu lệnh SQL dược đây chèn sáu bản ghi vào bảng Clients Mỗi bản ghi chứa một tài liệu XML và cấu trúc của mỗi tài liệu XML thay đổi đến một mức độ nào đó Ví dụ, các địa chỉ email cho những khách hàng sẵn có chứ không phải khách hàng khác
Trang 21Ví dụ 10 Dữ liệu mẫu cho bảng các Client
Trang 27Môi trường truy vấn
Tất cả các truy vấn trong bài viết này được thiết kế để có thể tương tác với nhau Bạn có thể làm điều đó qua bộ xử lý dòng lệnh của DB2 (DB2 command line processor) hoặc bộ soạn thảo DB2 Command Editor của DB2 Control Center Các
ví dụ trong bài viết này sử dụng bộ xử lý dòng lệnh DB2 (DB2 cũng gắn bộ
Eclipse-dựa trên Developer Workbench có thể giúp bạn xây dựng các câu XQuery bằng biểu đồ, nhưng phần Developer Workbench nằm ngoài phạm vi của bài viết này.)
Bạn có thể thay đổi các cài đặt mặc định với bộ xử lý dòng lệnh DB2 để làm việc với dữ liệu XML dễ dàng hơn Ví dụ, lệnh sau đây (đưa ra từ một cửa sổ lệnh DB2) sẽ bắt đầu chạy bộ xử lý lệnh DB2 để các kết quả XQuery sẽ được hiển thị trên định dạng dễ đọc:
Trang 28Các thao tác lấy dữ liệu XML đơn giản
Trong đoạn này, bạn sẽ học cách viết các câu XQuery để lấy về toàn bộ tài liệu XML và chỉ rõ các vị trí (hoặc các phân đoạn) của các tài liệu XML Để làm được như vậy, bạn dùng các biểu thức XPath và các biểu thức FLWOR
Lấy toàn bộ các tài liệu XML đã lưu trữ trong DB2
Khi chạy như một ngôn ngữ bậc cao, XQuery cần phải có một nguồn dữ liệu đầu vào Trong DB2, bạn có thể xác định nguồn dữ liệu đầu vào này bằng cách gọi hàm có tên db2-fn:xmlcolumn Hàm này đưa một tham số đầu vào để xác định bảng DB2 và các tên cột XML quan tâm Hàm db2-fn:xmlcolumn trả về một dãy các tài liệu XML đã lưu trữ trong cột cho trước Ví dụ, truy vấn sau trả về một chuỗi các tài liệu XML chứa thông tin liên hệ (contactinfo) của khách hàng:
Ví dụ 12 Câu XQuery đơn giản trả về thông tin liên hệ (contactinfo) của khách hàng
Trang 29bạn xác định ngược lại, DB2 coi các tên bảng và cột vào trường hợp cao hơn ở danh mục bên trong nó Bởi vì XQuery là cấu trúc động, các tên bảng và cột ở trường hợp thấp hơn sẽ không phù hợp với các tên ở trường hợp cao hơn trong danh mục DB2
Bây giờ hãy xem đầu ra của câu XQuery này Cho dữ liệu mẫu đã được chèn vào bảng Clients, đầu ra của truy vấn trong Ví dụ 12 là một chuỗi gồm 6 tài liệu XML được trình bày dưới đây
Ví dụ 13 Kết quả của truy vấn trước