DB2 XML Extender 為 DB2 Universal Database 注入原生 XML 處理能力,提供用戶定義型別 (UDT)、函數 (UDF) 與預存程序三大擴展組件。核心價值在於:讓 SQL 成為存取 XML 文件的主要介面,並透過 GUI 精靈、管理預存程序與命令列工具大幅降低維運複雜度。支援三種儲存模式:資料庫內部欄位 (XMLVarchar/XMLCLOB)、外部檔案系統 (XMLFILE) 以及關聯表映射 (XML Collections),滿足歸檔、高頻查詢、大型文件等多元場景。
適用於文件已存在、以讀為主、需原封不動保存原始結構的場景 (如新聞稿、訂單歸檔)。文件插入支援 XML 的欄位後,可透過 Document Access Definition (DAD) 將特定元素/屬性映射至 Side Tables (副表) 建立索引,加速頻繁查詢路徑。DB2 Text Extender 可進一步提供結構化全文檢索。啟用欄位指令範例:dxxadm enable_column XMLtest person person c:TEMPpersonColumn.dad -r id。
適用於現有關聯資料需組合成 XML、或 XML 需分解入關聯表、頻繁局部更新、文件超過 2GB 等場景。DAD 定義 XML 標記與資料表欄位的雙向映射:dxxInsertXML 將文件分解入表,dxxRetrieveXML 從表組合文件。僅儲存感興趣的資料值,標記不入庫,極大節省空間並提升更新效能。
啟用資料庫時自動建立 DTD_REF 表,儲存 DTD 內容與中繼資料 (作者、建立者、更新者、使用計數)。透過 XMLClobFromFile UDF 可將外部 DTD 檔案匯入:INSERT INTO db2XML.dtd_ref ... VALUES ('C:TEMPperson.dtd', db2xml.XMLClobFromFile('C:TEMPperson.dtd'), 0, ...)。文件插入前可指定 DAD 中 <validation>YES</validation> 強制驗證。
DAD 為符合 XML 格式的映射描述檔,XML_USAGE 表統一管理。位置路徑採類 XPath 語法 (清單 1):/ 根元素、/tag1/tag2 子孫鏈、//tagn 任意深度匹配、/tag1//tagn 混合模式、/tag1/tag2/@attr1 屬性存取、[@attr1="5"] 謂詞過濾。XML Columns 模式下用於定義 Side Table 索引欄位映射;XML Collections 模式下定義完整雙向轉換規則。
| 型別 | 儲存位置 | 最大長度 | 適用場景 |
|---|---|---|---|
| XMLVarchar | 資料庫內部 | 3 KB | 小型文件、高頻存取 |
| XMLCLOB | 資料庫內部 | 2 GB | 中大型文件、需交易一致性 |
| XMLFILE | 外部檔案系統 | 受限於檔案系統 | 超大文件、既有檔案架構整合 |
D:db2XMLyourPlatform/readmeD:db2XMLnt/setup.exe,選擇 Server/Client、Typical 安裝、預設路徑 C:dxxCREATE DATABASE MYDBcd /d C:DXXBND && db2 bind @dxxbind.lstcd /d %DB2PATH%bnd && db2 bind @db2cli.lstdxxinstallchk mydb > out 2>&1,輸出應包含 DXXA006I The database was enabled successfully 等成功標記-- DTD 定義 (person.dtd)
<!ELEMENT person (firstName,lastName,country,phone*)>
<!ATTLIST person id CDATA #REQUIRED>
...
-- 建表
CREATE TABLE person(id INTEGER NOT NULL PRIMARY KEY,
person db2xml.XMLclob notlogged);
-- 註冊 DTD
INSERT INTO db2XML.dtd_ref(dtdid, content, usage_count, author, creator, updator)
VALUES('C:TEMPperson.dtd', db2xml.XMLClobFromFile('C:TEMPperson.dtd'), 0, 'xmlext','xmlext','XMLext');
-- DAD 定義 (personColumn.dad) - 含驗證與三張 Side Tables
<Xcolumn>
<table name="person_names">
<column name="fname" type="varchar(50)" path="/person/firstName" multi_occurrence="NO"/>
<column name="lname" type="varchar(50)" path="/person/lastName" multi_occurrence="NO"/>
</table>
<table name="person_phone_number">
<column name="pnumber" type="varchar(20)" path="/person/phone/number" multi_occurrence="YES"/>
</table>
<table name="person_phone_type">
<column name="ptype" type="varchar(20)" path="/person/phone/type" multi_occurrence="YES"/>
</table>
</Xcolumn>
-- 啟用欄位 (含驗證與 Side Tables)
dxxadm enable_column XMLtest person person c:TEMPpersonColumn.dad -r id
-- INSERT: 從檔案匯入
INSERT INTO person VALUES(1, db2xml.xmlclobfromfile('c:TEMPperson.XML'));
-- EXTRACT (使用 Side Tables 索引加速)
SELECT pnumber FROM person_names t1, person_phone_number t2, person_phone_type t3
WHERE t1.id = t2.id AND t1.id = t3.id AND t2.dxx_seqno = t3.dxx_seqno
AND t1.lname='Smith' AND t3.ptype='Office';
-- EXTRACT (無 Side Tables,即時解析)
SELECT lname, fname FROM person1 t1, person_names t2
WHERE t1.id = t2.id AND db2XML.extractVarchar(person, '/person/country') = 'US';
-- UPDATE: 整份文件替換
UPDATE person SET person = db2xml.XMLCLOBFromFile('c:TEMPpersonbis.XML');
-- RETRIEVE: 匯出至檔案
SELECT db2xml.Content(person, 'c:tempretrIEvedperson.XML') FROM person WHERE id = 1;
-- 目標關聯表結構
CREATE TABLE Customer(ID INTEGER NOT NULL PRIMARY KEY, Country VARCHAR(30), LName VARCHAR(30), FName VARCHAR(30));
CREATE TABLE Customer_Details(ID INTEGER, Phone_Number VARCHAR(20), Phone_Type VARCHAR(20),
CONSTRAINT CUST_DETAIL_FK FOREIGN KEY (ID) REFERENCES Customer (ID));
-- DAD 定義雙向映射 (略),支援 dxxInsertXML 分解、dxxRetrieveXML 組合
-- 適用於:現有關聯資料生成 XML、異構 XML 來源入庫、頻繁部分更新、大文件分解
| 決策因子 | 選 XML Columns | 選 XML Collections |
|---|---|---|
| 文件來源 | 既有 XML 文件歸檔 | 關聯資料生成 XML / 異構 XML 入庫 |
| 更新頻率 | 低 (整份替換) | 高 (局部欄位更新) |
| 文件大小 | < 2 GB | 任意 (可分解) |
| 查詢模式 | 已知熱點路徑可建 Side Table 索引 | 標準 SQL 查詢關聯表 |
| 標記保存 | 完整保留原始標記 | 僅存資料值,標記不入庫 |
DB2 XML Extender 以 DAD 為核心映射引擎,靈活支援文件導向與資料導向兩大範式,配合 UDT 型別選擇與 Side Table 索引策略,為企業構建關聯/XML 混合資料平台提供成熟可靠的解決方案。