從 DB2 V8.x XML Extender 遷移至 DB2 9 pureXML,涉及儲存模型、索引、查詢、驗證、工具鏈全面變革。本文提供詳細對照表、遷移步驟、程式碼改寫範例與注意事項,助您平滑升級。
| 面向 | V8.x (XML Extender) | DB2 9 (pureXML) |
|---|---|---|
| 儲存 | CLOB/VARCHAR/FILE 或分解關聯表 | 原生 XML 型別,解析樹儲存 |
| 索引 | 副表間接索引 | XML Pattern 直接索引節點 |
| 查詢 | SQL/XML + Extender UDF | XQuery + SQL/XML 原生支援 |
| 驗證 | DTD/Schema 外部表,隱式/顯式 | XSR 內建,僅支援 Schema 顯式驗證 |
| 分解 | DAD 映射檔 | Annotated Schema 映射 |
| 工具 | Development Center 分散 | Control Center / Developer Workbench / VS.NET 整合 |
| 啟用 | 需 dxxadm enable_db | UTF-8 資料庫原生支援 |
-- V8.x: 建立副表間接索引
-- DB2 9: 直接對 XML 欄位建立 XML 索引
CREATE UNIQUE INDEX ORDER_KEY ON PURCHASEORDER (INFO)
GENERATE KEY USING XMLPATTERN '/PURCHASEORDER/@POID' AS SQL DOUBLE;
CREATE INDEX ORDER_NAME ON PURCHASEORDER (INFO)
GENERATE KEY USING XMLPATTERN '/PURCHASEORDER/SHIPTO/NAME' AS SQL VARCHAR(128);
XML Pattern:無述詞 XPath,僅支援子軸 / 與後代軸 //。
REGISTER XMLSCHEMA ... FROM ... AS ... → COMPLETE XMLSCHEMA ...。APPLHEAPSZ(建議 1000+)。在 Schema 內以註解標示關聯映射,註冊時 ENABLE DECOMPOSITION。單一文件可同時保留原生 XML 欄位與分解關聯欄位。
| 分類 | 新增函數 |
|---|---|
| 發布 | XMLCOMMENT, XMLPI, XMLTEXT, XMLDOCUMENT |
| 解析/轉型/驗證 | XMLPARSE, XMLCAST, XMLVALIDATE, IS VALIDATED |
| 查詢 | XMLQUERY, XMLEXISTS, XMLTABLE |
| 序列化 | XMLSERIALIZE (CONTENT ... AS CLOB/BLOB) |
INSERT INTO PRODUCT (PID, INFO)
SELECT X.PID, X.DOC
FROM XMLTABLE('$INFO//PRODUCT' PASSING XMLPARSE(DOCUMENT CAST(? AS BLOB(2M))) AS "INFO"
COLUMNS PID VARCHAR(12) PATH '@PID', DOC XML BY REF PATH '/') AS X;
CREATE DB MIGRATE USING CODESET UTF-8 TERRITORY USDB2XML.DTD_REF 匯出 DTD,用工具轉 XSD。REGISTER XMLSCHEMA ... COMPLETE XMLSCHEMA ...XMLCLOB/VARCHAR/FILE 改為 XML 型別;若原建副表索引用於查詢,現可直接對 XML 欄位建 XML 索引,簡化結構。EXPORT TO ... OF DEL LOBS TO ... MODIFIED BY LOBSINFILE SELECT ...IMPORT FROM ... OF DEL LOBS FROM ... MODIFIED BY XMLCHAR INSERT INTO ...CAST(INFO AS CLOB) 強制寫入 LOB 檔。//column/@path → XMLPATTERN,//column/@type → SQL 型別;主鍵路徑建 UNIQUE INDEX。| 操作 | V8.x 寫法 | DB2 9 寫法 |
|---|---|---|
| 插入原生 XML | INSERT INTO CUST (INFO) VALUES (?) | 相同;需驗證加 XMLVALIDATE(?) |
| 分解插入 | CALL DXXSHREXML(...) | CALL XDBDECOMPXML(...) 或 XMLTABLE |
| 子文件更新 | DB2XML.UPDATE(INFO, PATH, VAL) | 無內建;使用 Java Stored Procedure (developerWorks 範例) |
| 查詢 XML 節點 | DB2XML.EXTRACTVARCHAR(INFO, PATH) | XMLCAST(XMLQUERY(...) AS VARCHAR) 或 XMLEXISTS |
| XSLT 轉換 | XSLTRANSFORMTOCLOB(INFO, XSL) | 改用 XQuery + SQL/XML 發布函數(功能重疊) |
| 關聯發布 XML | DAD 雙向映射 | 僅 SQL/XML 發布函數 |
IBM 提供 Java 遷移工具 MigrateUtility,自動產生:匯出/修改欄位/匯入/註冊 Schema/建 XML 索引/刪除副表 的 DDL 腳本。
java Migrate -p /temp/migrate -d MIGRATE -s HARDEEP -t PURCHASEORDER -c INFO -b XMLEXTENDERDATA
/text();避免 //、*、冗餘 /text()。CAST(? AS BLOB) 避免編碼頁轉換。[$i/customerinfo[name="Hardeep"]] 而非 $i/customerinfo[name="Hardeep"],否則非空序列皆為 True。遷移至 pureXML 不僅是型別變更,更是應用架構簡化:商務邏輯下沉資料庫層(View/Stored Procedure),中介層輕量化,資料過濾後再傳輸,契合 SOA 理念。建議分階段遷移:優先高價值 XML 工作負載,驗證效能與功能後再全面推廣。