Các khái niệm cơ bản của DB2: Giới thiệu các hàm
xuất bản SQL/XML
XML là Ngôn ngữ đánh dấu có thể mở rộng, một định dạng dữ liệu thông dụng để xuất bản, lưu
trữ và chia sẻ các tài liệu có cấu trúc. XML có thể được sử dụng để trao đổi dữ liệu giữa các máy
tính. Một văn bản được đánh dấu có thể được phân loại theo loại nút XML, chẳng hạn như "tài
liệu", "phần tử", "thuộc tính", hoặc "văn bản" và nhiều loại khác. "Không gian tên" được gắn với
tên của các nút, chẳng hạn như các phần tử và các thuộc tính.
SSQL/XML là mở rộng của chuẩn ngôn ngữ SQL (ANSI/ISO), gồm các hàm xuất bản XML để
chuyển đổi dữ liệu quan hệ vào XML. Cơ sở dữ liệu của DB2 của IBM cho Linux, UNIX, và
Windows (DB2 UDB) bao gồm các hàm xuất bản SQL/XML được lập sẵn để nó dễ dàng xuất
bản dữ liệu UDB của DB2 vào một tài liệu XML. Các hàm này cho phép bạn tạo các tài liệu
XML có nhãn bằng các đối tượng lớn của các ký tự (loại CLOB, một trong các kiểu dữ liệu có
sẵn của UDB trong DB2). Bạn có thể sử dụng câu lệnh SELECT để lắp ráp các nút XML cần
thiết, và thâu tóm các văn bản được đánh dấu nhờ định hướng xuất ra một tệp. Bạn cũng có thể
sử dụng một câu lệnh INSERT để ghi các văn bản tạo ra vào một bảng.
Các hàm xuất bản SQL/XML
DB2 UDB phiên bản 8.2 hỗ trợ bảy hàm xuất bản SQL/XML:
XMLSERIALIZE
XMLELEMENT
XMLFOREST
XMLATTRIBUTES
XMLCONCAT
XMLAGG
XMLNAMESPACES
Các phần sau sẽ giới thiệu cho bạn từng hàm xuất bản một. Mặc dù các loại của phần tử XML và
các thuộc tính mà bạn có thể xây dựng với các hàm này hầu như không giới hạn, các ví dụ trong
bài viết này tập trung vào các yếu tố bảng XML và các thuộc tính. Các ví dụ này yêu cầu phải
nối cơ sở dữ liệu SAMPLE; nếu bạn chưa có cơ sở dữ liệu SAMPLE trong hệ thống của bạn, bạn
có thể tạo ra nó bằng cách nhập lệnh db2sampl từ bất kỳ dấu nhắc lệnh nào.
XMLSERIALIZE
Hàm XMLSERIALIZE chuyển đổi một giá trị XML thành một chuỗi được lưu như các giá trị
xmlelement(name "td", e.empno),
xmlelement(name "td", e.firstnme),
xmlelement(name "td", e.lastname),
xmlelement(name "td", e.phoneno),
xmlelement(name "td", d.deptno),
xmlelement(name "td", substr(d.deptname, 1, 24))
)
as clob(120)
) as "result"
from employee e, department d
where e.workdept = d.deptno and year(hiredate) < 1970; <tr><td>000010</td><td>CHRISTINE</td><td>HAAS</td><td>3978</td>
<td>A00</td><td>SPIFFY COMPUTER SERVICE </td></tr>
<tr><td>000050</td><td>JOHN</td><td>GEYER</td><td>6789</td>
<td>E01</td><td>SUPPORT SERVICES </td></tr>
<tr><td>000110</td><td>VINCENZO</td><td>LUCCHESSI</td><td>3490</td>
<td>A00</td><td>SPIFFY COMPUTER SERVICE </td></tr>
<tr><td>000120</td><td>SEAN</td><td>O'CONNELL</td><td>2167</td>
<td>A00</td><td>SPIFFY COMPUTER SERVICE </td></tr>
<tr><td>000200</td><td>DAVID</td><td>BROWN</td><td>4501</td>
<td>D11</td><td>MANUFACTURING SYSTEMS </td></tr>
<tr><td>000220</td><td>JENNIFER</td><td>LUTZ</td><td>0672</td>
<td>D11</td><td>MANUFACTURING SYSTEMS </td></tr>
<tr><td>000230</td><td>JAMES</td><td>JEFFERSON</td><td>2094</td>
<td>D21</td><td>ADMINISTRATION SYSTEMS </td></tr>
<tr><td>000250</td><td>DANIEL</td><td>SMITH</td><td>0961</td>
<td>D21</td><td>ADMINISTRATION SYSTEMS </td></tr>
<tr><td>000280</td><td>ETHEL</td><td>SCHNEIDER</td><td>8997</td>
MANUFACTURING
SYSTEMS
000230 JAMES JEFFERSON 2094 D21
ADMINISTRATION
SYSTEMS
000250 DANIEL SMITH 0961 D21
ADMINISTRATION
SYSTEMS
000280 ETHEL SCHNEIDER 8997 E11 OPERATIONS
000310 MAUDE SETRIGHT 3332 E11 OPERATIONS
000320 RAMLAL MEHTA 9990 E21 SOFTWARE SUPPORT
000340 JASON GOUNOT 5698 E21 SOFTWARE SUPPORT
XMLFOREST
Hàm XMLFOREST kiến thiết một xâu (rừng) các nút phần tử XML. XMLFOREST là một hàm
vô hướng trả về một giá trị với cùng loại dữ liệu trong XML như các đối số.
Liệt kê 2 cho thấy ví dụ về cách sử dụng hàm XMLFOREST lồng nhau trong một hàm
XMLELEMENT để tạo ra bảng dữ liệu XML. Một lần gọi hàm XMLFOREST được dùng để tạo
ra các phần tử (<td>) của ô trong bảng dữ liệu, lồng trong các (<tr>) của hàng trong bảng. Liệt kê
2 cũng cho thấy bản ghi đầu tiên thu được từ truy vấn này, lại hiện trên hai dòng. Bảng 2 là kết
xuất được biến đổi sau khi nó đã được chèn vào một phần tử bảng XML.
Liệt kê 2. Sử dụng hàm XMLFOREST để tạo các phàn tử bảng XML từ các dữ liệu quan
hệ
connect to sample select xmlserialize(
content xmlelement(
name "tr",
SERVICE DIV.
000050 JOHN GEYER 6789 E01 SUPPORT SERVICES
000110 VINCENZO LUCCHESSI 3490 A00
SPIFFY COMPUTER
SERVICE DIV.
000120 SEAN O'CONNELL 2167 A00
SPIFFY COMPUTER
SERVICE DIV.
000200 DAVID BROWN 4501 D11
MANUFACTURING
SYSTEMS
000220 JENNIFER LUTZ 0672 D11
MANUFACTURING
SYSTEMS
000230 JAMES JEFFERSON 2094 D21 ADMINISTRATION
SYSTEMS
000250 DANIEL SMITH 0961 D21
ADMINISTRATION
SYSTEMS
000280 ETHEL SCHNEIDER 8997 E11 OPERATIONS
000310 MAUDE SETRIGHT 3332 E11 OPERATIONS
000320 RAMLAL MEHTA 9990 E21 SOFTWARE SUPPORT
000340 JASON GOUNOT 5698 E21 SOFTWARE SUPPORT
XMLATTRIBUTES
Hàm XMLATTRIBUTES kiến thiết một hay nhiều nút thuộc tính XML cho một nút phần tử
XML. XMLATTRIBUTES là một hàm vô hướng, trả về giá trị kiểu XML.
Liệt kê 3 cho thấy ví dụ về cách sử dụng hàm XMLATTRIBUTES kết hợp với hàm
XMLELEMENT để tạo bảng dữ liệu XML. Trong trường hợp này, ba trong số các phần tử
(<td>) của ô của bảng được tạo ra nhận thuộc tính căn chỉnh cột ("align =" center"'). Liệt kê 3
cũng cho thấy bản ghi đầu tiên được trả lại bằng truy vấn này, một lần nữa xuất hiện trên hai
<td
align="center">3978</td><td
align="center">A00</td>
<td>SPIFFY COMPUTER SERVICE </td></tr>
connect reset
Trong ví dụ này, hàm XMLELEMENT đang gọi hàm XMLATTRIBUTES để xác định thuộc
tính căn chỉnh cột cho ba cột đầu ra. Bảng 3 là kết xuất được xếp tuần tự.
Bảng 3. Đoạn trích kết xuất được xếp tuần tự từ hàm XMLELEMENT
EMPNOFIRST_NAMELAST_NAME
PHONENODEPTNO DEPARTMENT
000010
CHRISTINE HAAS 3978 A00
SPIFFY COMPUTER
SERVICE
000050
JOHN GEYER 6789 E01 SUPPORT SERVICES
000110
VINCENZO LUCCHESSI 3490 A00
SPIFFY COMPUTER
SERVICE
content xmlelement(
name "tr", xmlconcat(
xmlelement(name "td", firstnme),
xmlelement(name "td", lastname)
)
)
as clob(48)
) as "result"
from employee
order by lastname; <tr><td>BRUCE</td><td>ADAMSON</td></tr>
connect reset
Trong ví dụ này, hàm XMLELEMENT gọi hàm XMLCONCAT để ghép một cặp các nút phần
tử XML lồng. Bảng 4 cho thấy kết xuất xếp tuần tự.
Bảng 4. Đoạn trích kết xuất được xếp tuần tự từ hàm XMLELEMENT
FIRST_NAMELAST_NAME
BRUCE ADAMSON
DAVID BROWN
JOHN GEYER
JASON GOUNOT
CHRISTINE HAAS
EILEEN HENDERSON
) as "result"
from employee
group by workdept having count(*) = 3; <tr
id="A00"><td>HAAS</td><td>LUCCHESSI</td><td>O'CONNELL</td></tr>
<tr
id="C01"><td>KWAN<
/td><td>NICHOLLS</td><td>QUINTANA</td></tr> connect reset
Trong ví dụ này, hàm XMLELEMENT đang gọi hàm XMLAGG để gộp các nút phần tử XML
lồng nhau. Bảng 5 cho thấy kết xuất xếp tuần tự.
Bảng 5. Kết xuất được xếp tuần tự của hàm XMLELEMENT
DEPTNO 1 2 3
A00 HAAS LUCCHESSI O'CONNELL
C01 KWAN
NICHOLLS
QUINTANA
XMLNAMESPACES
Hàm XMLNAMESPACES kiến thiết các khai báo không gian tên của XML từ các đối số. Các
khai báo nằm trong phạm vi của các phần tử do các hàm XMLELEMENT và XMLFOREST tạo
nên. XMLNAMESPACES là một hàm vô hướng, trả về giá trị kiểu XML.
Một không gian tên XML có thể được dùng để bổ nghĩa một phần tử hoặc tên của một thuộc tính
bằng cách kết hợp nó với trình định danh tài nguyên thông dụng cụ thể (URI). Nó là tập các tên
được sử dụng trong các tài liệu XML, như các loại phần tử và tên của thuộc tính. Không gian tên
) as "result"
from employee
order by lastname; <tr><td><emp
xmlns="">ADAMSON</emp></td><
/tr>
<tr><td><emp
xmlns="">BROWN</emp></td></tr>
connect reset
Trong thí dụ này, các XMLELEMENT gọi hàm XMLNAMESPACES để kiến thiết không gian
tên mặc định, mà đã được thiết lập với các xâu rỗng. Bảng 6 cho thấy đầu ra tuần tự.
Bảng 6. Trích đoạn đầu ra tuần tự từ hàm XMLELEMENT
EMP_NAME
<emp
xmlns="">ADAMSON</emp>
<emp
xmlns="">BROWN</emp>