Tải bản đầy đủ (.pdf) (9 trang)

Cách “băm nhỏ” các tài liệu XML bằng DB2 (phần II) doc

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (184.32 KB, 9 trang )

Cách “băm nhỏ” các tài liệu XML bằng DB2 (phần II)

Đăng ký giản đồ chú thích
Sau khi đã tạo một XML Schema có chú thích, bạn cần đăng ký nó trong
XML Schema Repository của cơ sở dữ liệu. Đối với giản đồ chú thích
trong hình 8, chúng ta có đầy đủ thẩm quyền để phát lệnh REGISTER
XMLSCHEMA với các tùy chọn COMPLETE và ENABLE
DECOMPOSITION của nó như thể hiện trong hình 10. Trong ví dụ này,
XML Schema được giả định cư trú trong file /xml/myschemas/cust2.xsd.
Nhờ vào hành động đăng ký, nó được gán Id SQL db2admin.cust2xsd. Id
này có thể được sử dụng cho việc tham chiếu giản đồ sau này. Tùy chọn
COMPLETE của lệnh chỉ thị rằng, không có các tài liệu XML Schema bổ
sung được thêm vào. Tùy chọn ENABLE DECOMPOSITION chỉ thị
rằng XML Schema có thể được sử dụng không những cho việc hợp lệ hóa
tài liệu mà còn có thể được sử dụng cho việc băm nhỏ (shred).
REGISTER XMLSCHEMA ''
FROM '/xml/myschemas/cust2.xsd'
AS db2admin.cust2xsd COMPLETE ENABLE
DECOMPOSITION;

Hình 10: Đăng ký giản đồ chú thích XML
Hình 11 thể hiện rằng bạn có thể truy vấn khung nhìn hạng mục DB2
syscat.xsrobjects để xác định xem liệu giản đồ đã đăng ký có được kích
hoạt cho sự phân tách (Y) hay chưa (N).
SELECT SUBSTR(objectname,1,10) AS objectname,

status, decomposition
FROM syscat.xsrobjects ;
OBJECTNAME STATUS DECOMPOSITION

CUST2XSD C Y



Hình 11: Kiểm tra trạng thái của XML schema có chú thích
Trạng thái DECOMPOSITION của giản đồ chú thích sẽ tự động được
thay đổi thành X (inoperative) và việc băm nhỏ sẽ bị vô hiệu hóa, nếu bất
kỳ các bảng mục tiêu nào bị hạ hoặc một cột mục tiêu nào đó bị thay đổi.
Không có cảnh báo nào xuất hiện khi điều này xảy ra và các cố gắng về
sau để sử dụng giản đồ cho việc băm nhỏ sẽ thất bại. Bạn có thể sử dụng
các lệnh dưới đây để vô hiệu hóa và kích hoạt một giản đồ chú thích cho
việc băm nhỏ:
ALTER XSROBJECT cust2xsd DISABLE DECOMPOSITION;
ALTER XSROBJECT cust2xsd ENABLE DECOMPOSITION;
Phân tách một tài liệu XML tại một thời điểm
Sau khi đã đăng ký và kích hoạt một XML Schema chú thích, bạn có thể
phân tách các tài liệu XML với lệnh DECOMPOSE XML DOCUMENT
hoặc với thủ tục lưu trữ. Lệnh DECOMPOSE XML DOCUMENT rất
thuận tiện sử dụng trong DB2 Command Line Processor (CLP), còn thủ
tục lưu trữ có thể được gọi từ một chương trình nào đó hoặc CLP. Lệnh
CLP sẽ cần đến hai tham số đầu vào: filename của tài liệu XML được
băm nhỏ và Id SQL của giản đồ chú thích, như thể hiện trong ví dụ bên
dưới:
DECOMPOSE XML DOCUMENT
/xml/mydocuments/cust01.xml
XMLSCHEMA db2admin.cust2xsd VALIDATE;
Từ khóa VALIDATE hoàn toàn mang tính tùy chọn và chỉ thị các tài liệu
XML có được hợp lệ hóa đối với giản đồ như một phần của quá trình băm
nhỏ hay không. Trong khi băm nhỏ, DB2 sẽ xem xét cả tài liệu XML và
giản đồ chú thích, phát hiện những vi phạm giản đồ mức cơ sở dù từ khóa
VALIDATE không được chỉ định. Cho ví dụ, quá trình băm nhỏ sẽ thất
bại nếu một thành phần nào đó có tính bắt buộc bị mất, dù thành phần này
không được băm nhỏ và từ khóa VALIDATE bị bỏ qua. Tương tự như

vậy, các thành phần không liên quan đến vấn đề được đề cập hoặc các vi
phạm về kiểu dữ liệu cũng là nguyên nhân gây ra sự thất bại cho quá trình
chia tách. Lý do ở đây là rằng quá trình băm nhỏ sẽ đi qua toàn bộ XML
Schema chú thích và tài liệu tức thời và phát hiện được các vi phạm về
giản đồ thậm chí bộ phân tích cú pháp XML không thực hiện hành động
hợp lệ hóa.
Để phân tách các tài liệu XML từ một chương trình ứng dụng, bạn có thể
sử dụng thủ tục lưu trữ XDBDECOMPXML. Các tham số của thủ tục
này được thể hiện trong hình 12 và được mô tả chi tiết trong bảng 6.
>>-XDBDECOMPXML ( rschema , xmlschemaname ,-
-xmldoc , >
> documentid , validation , reserved ,
reserved , >
> reserved )
><
Hình 12: Cú pháp và các tham số của thủ tục lưu trữ XDBDECOMPXML
Tham số Mô tả
rschema Phần giản đồ quan hệ của Id SQL (SQL identifier) hai
phần trong XML Schema chú thích. Cho ví dụ, Id SQL
của XML Schema là db2admin.cust2xsd, thì bạn nên
pass chuỗi 'db2admin' đến tham số này. Trong DB2 cho
z/OS, giá trị này phải là 'SYSXSR' hoặc NULL.
xmlschemaname

Phần thứ hai nằm trong Id SQL của XML Schema chú
thích. Nếu Id SQL của XML Schema là
db2admin.cust2xsd, thì bạn có thể pass chuỗi 'cust2xsd'
đến tham số này. Giá trị lúc này không thể là NULL.
xmldoc Trong DB2 cho Linux, UNIX, và Windows, tham số n
ày

có kiểu BLOB(1M) và sẽ phân tách tài liệu XML. Trong
DB2 cho z/OS, tham số này có kiểu CLOB AS
LOCATOR. Và không thể là NULL.
documentid Một chuỗi mà bộ gọi có thể sử dụng để phân biệt tài liệu
XML đầu vào. Giá trị được cấp sẽ được thay thế cho bất
kỳ mục đích của $DECOMP_DOCUMENTID nào được
chỉ định trong các chú thích db2-xdb:expression hoặc
db2-xdb:condition.
validation Các giá trị có thể nhận là 0 (không hợp lệ) và 1 (sự hợp
lệ được thực hiện). Tham số này không tồn tại trong
DB2 cho z/OS.
reserved Các tham số được dự trữ để sử dụng sau này. Các giá trị
được pass cho các đối số này phải là NULL. Các tham
số này không tồn tại trong DB2 cho z/OS.

Bảng 6: Phần mô tả các tham số của thủ tục XDBDECOMPXML
Một đoạn mã Java dùng để gọi thủ tục lưu trữ được thể hiện trong hình
13.
CallableStatement callStmt = con.prepareCall(
"call SYSPROC.XDBDECOMPXML(?,?,?,?,?, null, null,
null)");
File xmldoc = new File("c:\mydoc.xml");
FileInputStream xmldocis = new
FileInputStream(xmldoc);
callStmt.setString(1, "db2admin" );
callStmt.setString(2, "cust2xsd" );
// document to be shredded:
callStmt.setBinaryStream(3,xmldocis,(int)xmldoc.l
ength() );
callStmt.setString(4, "mydocument26580" );

// no schema validation in this call:
callStmt.setInt(5, 0);
callStmt.execute();

Hình 13: Mã Java để triệu gọi thủ tục XDBDECOMPXML
Tham số đầu vào cho các tài liệu XML là kiểu CLOB AS LOCATOR
trong DB2 cho z/OS, còn nó sẽ là kiểu BLOB(1M) trong DB2 cho Linux,
UNIX, và Windows. Nếu bạn mong đợi các tài liệu XML của mình lớn
hơn 1MB, hãy sử dụng một trong các thủ tục được liệt kê trong bảng 7.
Các thủ tục này đều giống nhau ngoại từ tên của chúng và kích thước của
tham số đầu vào xmldoc. Khi bạn gọi một thủ tục, DB2 sẽ chỉ định bộ
nhớ theo kích thước được tuyên bố của các tham số đầu vào. Cho ví dụ,
nếu tất cả các tài liệu đầu vào của bạn hầu như đều có kích thước 10MB,
thủ tục XDBDECOMPXML10MB sẽ là một lựa chọn tốt nhất cho bộ
nhớ.
Thủ tục Kích thước tài liệu

Được hỗ trợ từ

XDBDECOMPXML ≤1MB DB2 9.1
XDBDECOMPXML10MB ≤10MB DB2 9.1
XDBDECOMPXML25MB ≤25MB DB2 9.1
XDBDECOMPXML50MB ≤50MB DB2 9.1
XDBDECOMPXML75MB ≤75MB DB2 9.1
XDBDECOMPXML100MB

≤100MB DB2 9.1
XDBDECOMPXML500MB

≤500MB DB2 9.5 FP3

XDBDECOMPXML1GB ≤1GB DB2 9.5 FP3
XDBDECOMPXML1_5GB

≤1.5GB DB2 9.7
XDBDECOMPXML2GB ≤2GB DB2 9.7

Bảng 7: Các thủ tục lưu trữ cho các kích thước tài liệu khác nhau (DB2
cho Linux, UNIX, và Windows)
Để có được khả năng tương thích nền tảng, DB2 cho z/OS hỗ trợ thủ tục
XDBDECOMPXML100MB với các tham số giống như DB2 cho Linux,
UNIX, và Windows, gồm có cả tham số để hợp lệ hóa.
Phân tách các tài liệu XML dưới dạng kích thước
DB2 9.7 cho Linux, UNIX, và Windows giới thiệu một thủ tục mới mang
tên XDB_DECOMP_XML_FROM_QUERY. Nó sử dụng một giản đồ
chú thích để phân tách một hoặc nhiều tài liệu XML đã chọn từ cột có
kiểu XML, BLOB, hoặc VARCHAR FOR BIT DATA. Sự khác biệt
chính đối với thủ tục XDBDECOMPXML là
XDB_DECOMP_XML_FROM_QUERY sử dụng một truy vấn SQL như
một tham số và thực thi nó để thu được các tài liệu đầu vào từ bảng DB2.
Với số lượng các tài liệu lớn hơn, thao tác LOAD theo sau là "bulk
decomp" (tách khối lượng lớn) có thể hiệu quả hơn so với việc băm nhỏ
các tài liệu. Hình 14 thể hiện các tham số của thủ tục này. Các tham số
commit_count và allow_access tương tự như các tham số tương ứng của
tiện ích IMPORT DB2. Các tham số total_docs, num_docs_decomposed,
và result_report là các tham số đầu ra để cung cấp thông tin về kết quả
của quá trình băm nhỏ với khối lượng lớn. Tất cả các tham số đều được
giải thích trong bảng 8.
>> XDB_DECOMP_XML_FROM_QUERY ( rschema ,
xmlschema , >
> query , validation , commit_count ,

allow_access , >
> reserved , reserved2 , continue_on_error
, >
> total_docs , num_docs_decomposed ,
result_report ) ><
Hình 14: Thủ tục XDB_DECOMP_XML_FROM_QUERY
Tham số Mô tả
rschema Tương tự như với XDBDECOMPXML
xmlschema Tương tự như xmlschemaname cho XDBDECOMPXML

query Chuỗi truy vấn kiểu CLOB(1GB), không nhận giá trị
NULL. Truy vấn phải là một câu lệnh SQL hoặc
SQL/XML SELECT và phải trả về hai cột. Cột đầu tiên
phải chứa một Id tài liệu khác với tài liệu XML trong cột
thứ hai của tập kết quả. Cột thứ hai chứa các tài liệu
XML được băm nhỏ và phải có kiểu XML, BLOB,
VARCHAR FOR BIT DATA, hoặc LONG VARCHAR
FOR BIT DATA.
validation Các giá trị có thể là: 0 (không hợp lệ) và 1 (sự hợp lệ
được thực hiện).
commit_count Giá trị số nguyên bằng hoặc lớn hơn 0. Giá trị 0 có ngh
ĩa
thủ tục không thực hiện bất cứ cam kết nào. Giá trị n có
nghĩa rằng một cam kết sẽ được thực hiện cứ sau n sự
phân tách tài liệu thành công.
allow_access Nhận giá trị là 1 hoặc 0. Nếu giá trị bằng 0, thủ tục sẽ có
được một khóa dành riêng trên tất cả các bảng được
tham chiếu trong XML Schema chú thích. Nếu giá trị là
1, thủ tục sẽ có được một khóa chia sẻ.
reserved,

reserved2
Các tham số được dự trữ cho sử dụng sau này và phải là
NULL.
continue_on

_error
Có thể là 1 hoặc 0. Giá trị 0 có nghĩa thủ tục sẽ stop do
tài liệu đầu tiên không thể được phân tách; cho ví dụ,
nếu tài liệu không tương xứng với XML Schema.
total_docs Một tham số đầu ra chỉ thị tổng số các tài liệu mà thủ tục
cố gắng phân tách.
num_docs_
decomposed
Tham số đầu ra chỉ thị số lượng các tài liệu đã đư
ợc phân
tách thành công.
result_report Tham số đầu ra kiểu BLOB(2GB). Chứa một tài liệu
XML để cung cấp các thông tin chuẩn đoán cho các tài
liệu không được phân tách thành công. Báo cáo này sẽ
không được tạo ra nếu tất cả các tài liệu đã được băm
nhỏ thành công.

Bảng 8: Các tham số cho XDB_DECOMP_XML_FROM_QUERY
Hình 15 thể hiện một lời gọi thủ tục
XDB_DECOMP_XML_FROM_QUERY trong CLP. Thao tác gọi thủ
tục này sẽ đọc tất cả các tài liệu XML từ cột info của bảng customer và
băm nhỏ chúng với XML Schema db2admin.cust2xsd có chú thích. Thủ
tục cam kết với chu kỳ 25 tài liệu và không stop nếu một tài liệu nào đó
không thể được băm nhỏ.
call SYSPROC.XDB_DECOMP_XML_FROM_QUERY

('DB2ADMIN', 'CUST2XSD', 'SELECT cid, info FROM
customer',
0, 25, 1, NULL, NULL, '1',?,?,?) ;
Value of output parameters

Parameter Name : TOTALDOCS
Parameter Value : 100
Parameter Name : NUMDOCSDECOMPOSED
Parameter Value : 100
Parameter Name : RESULTREPORT
Parameter Value : x''
Return Status = 0

Hình 15: Gọi thủ tục
SYSPROC.XDB_DECOMP_XML_FROM_QUERY
Nếu bạn thường thực hiện băm nhỏ với khối lượng lớn trong CLP, hãy sử
dụng lệnh DECOMPOSE XML DOCUMENTS thay vì thủ tục. Cách
thức này sẽ thuận tiện hơn trong trường hợp thao tác với dòng lệnh mà
vẫn thực hiện các công việc các công cụ như thủ tục
XDB_DECOMP_XML_FROM_QUERY. Hình 16 thể hiện cú pháp của
lệnh. Các mệnh đề khác nhau và các từ khóa của lệnh đều có nghĩa giống
như các tham số thủ tục tương ứng. Cho ví dụ, query là lệnh SELECT
cung cấp các tài liệu đầu vào, và xml-schema-name là Id SQL hai phần
của XML Schema chú thích.
>>-DECOMPOSE XML DOCUMENTS IN 'query'
XMLSCHEMA >
ALLOW NO
ACCESS
> xml-schema-name + + +
+ >

'-VALIDATE-' '-ALLOW ACCESS-
'
> + + +
+ >
'-COMMITCOUNT integer-' '-CONTINUE_ON_ERROR-
'
> + +
><
'-MESSAGES message-file-
Hình 16: Cú pháp của lệnh DECOMPOSE XML DOCUMENTS
Hình 17 minh chứng sự thực thi của lệnh DECOMPOSE XML
DOCUMENTS trong DB2 Command Line Processor.
DECOMPOSE XML DOCUMENTS
IN 'SELECT cid, info FROM
customer'
XMLSCHEMA db2admin.cust2xsd MESSAGES
decomp_errors.xml ;
DB216001I The DECOMPOSE XML DOCUMENTS command
successfully
decomposed all "100" documents.

Hình 17: Ví dụ của lệnh DECOMPOSE XML DOCUMENTS
Nếu bạn không chỉ định message-file thì một báo cáo lỗi sẽ xuất hiện ở
đầu ra. Hình 18 thể hiện một báo cáo lỗi. Với tài liệu bị thất bại trong quá
trình băm nhỏ, một thông báo lỗi sẽ thể hiện Id tài liệu (xdb:documentId).
Id này được thu về từ cột đầu tiên được sinh ra bởi câu lệnh SQL trong
lệnh DECOMPOSE XML DOCUMENTS. Báo cáo lỗi cũng có chứa cả
thông báo lỗi DB2 cho các tài liệu bị thất bại. Hình 18 thể hiện tài liệu
1002 gồm có một thuộc tính XML không mong đợi có tên gọi status, và
tài liệu 1005 có chứa một thành phần hoặc giá trị thuộc tính abc không

hợp lệ vì XML Schema mong muốn tìm ra giá trị kiểu xs:integer.
<?xml version='1.0' ?>
<xdb:errorReport

xmlns:xdb=" />">
<xdb:document>
<xdb:documentId>1002</xdb:documentId>
<xdb:errorMsg>SQL16271N Unknown attribute
"status" at or
near line "1" in document
"1002".</xdb:errorMsg>
</xdb:document>
<xdb:document>
<xdb:documentId>1005</xdb:documentId>
<xdb:errorMsg>
SQL16267N An XML value "abc"
at or near
line "1" in document "1005" is not valid
according to

its declared XML schema type "xs:integer"
or is outside
the supported range
of values for the XML
schema type
</xdb:errorMsg>
</xdb:document>
</xdb:errorReport>

Hình 18: Báo cáo lỗi từ quá trình phân tách với khối lượng lớn

Kết luận
Khi bạn muốn thực hiện việc băm nhỏ các tài liệu XML thành các bảng
quan hệ, hãy nhớ rằng XML và dữ liệu quan hệ được dựa trên các mô
hình dữ liệu khác nhau về nền tảng. Mối quan hệ 1-n được diễn giải bằng
cách sử dụng nhiều bảng và join các mối quan hệ giữa chúng. Ngược lại,
các tài liệu XML thiên về có cấu trúc xếp chồng và thứ bậc có thể thể
hiện nhiều mối quan hệ 1-n trong một tài liệu. XML cho phép các thành
phần được lặp lại với số lần bất kỳ và XML Schemas có thể định nghĩa
hàng trăm, thậm chí hàng nghìn các thành phần tùy chọn và các thuộc
tính để có thể tồn tại hay không tồn tại trong bất cứ tài liệu đã cho nào.
Do có sự khác nhau này, nên việc băm nhỏ dữ liệu XML vào các bảng
quan hệ có thể khó khăn, không hiệu quả, và đôi khi khá phức tạp.
Nếu kiến trúc của dữ liệu XML nằm trong giới hạn của sự phức tạp cho
phép đối với việc bản đồ thành các bảng quan hệ, thêm vào đó nếu định
dạng XML của bạn không thể thay đổi theo thời gian thì việc băm nhỏ
XML đôi khi có thể là một cách làm hữu dụng để cung cấp các ứng dụng
quan hệ và các phần mềm báo cáo đang tồn tại.
DB2 cung cấp hai phương pháp băm nhỏ dữ liệu. phương pháp đầu tiên
sử dụng các câu lệnh INSERT của SQL với hàm XMLTABLE. Một câu
lệnh INSERT như vậy được yêu cầu cho mỗi một bảng mục tiêu và nhiều
câu lệnh có thể được kết hợp trong một thủ tục lưu trữ để tránh lặp lại
việc phân tích các tài liệu XML giống nhau. Các câu lệnh băm nhỏ có thể
gồm có các hàm của XQuery và SQL, join vào các bảng khác, hoặc tham
chiếu cho chuỗi DB2. Các tính năng này cho phép tùy chỉnh và có độ linh
hoạt cao trong quá trình băm, tuy nhiên yêu cầu việc viết mã thủ công.
Phương pháp thứ hai cho việc băm dữ liệu XML là sử dụng các chú thích
trong một XML Schema để định nghĩa việc bản đồ hóa từ XML sang các
bảng và các cột cơ sở dữ liệu. IBM Data Studio Developer cung cấp một
giao diện trực quan giúp thuận tiện và không cần việc viết mã thủ công
cho quá trình bản đồ hóa này.


×