Oracle 9i 引入 XMLType 系統定義的對象類型,用於高效存儲、管理、查詢與轉換 XML 數據,內置豐富函數支持節點提取、索引、聚合生成等操作。
CREATE TABLE abc (
id NUMBER,
xmldoc SYS.XMLType
);
INSERT INTO abc (id, xmldoc) VALUES (
abc_seq.NEXTVAL,
SYS.XMLType.createXML('abc ')
);
SELECT xmldoc.extract('//name/a[@id=1]/@value').getStringVal() FROM abc;SELECT xmldoc.extract('//name/a/text()').getStringVal() FROM abc;SELECT xmldoc.extract('/root/name/@id').getStringVal() FROM abc;UPDATE abc SET xmldoc = updateXML(xmldoc, '//name/a[@id=1]/@value', 'new value')
WHERE ...;
注意:若目標節點不存在,更新將無效果。
利用臨時 CLOB 列中轉:
INSERT INTO abc (id, xmldoc) VALUES (seq.NEXTVAL, SYS.XMLType.createXML((SELECT clob_col FROM temp_table WHERE ...)));| 特性 | 說明 |
|---|---|
| XMLType | 系統預定義類型,支持列創建、PL/SQL 參數傳遞、存儲索引處理 |
| DBMS_XMLGEN | PL/SQL 包,將 SQL 查詢結果轉為標準 XML,返回 XMLType 或 CLOB,內核級 C 實現,性能優異 |
| SYS_XMLGEN | SQL 函數,將單值/對象/XMLType 實例轉為 XML 文檔,返回 XMLType |
| SYS_XMLAGG | 聚合函數,將多個 XML 片段連接並添加根標籤,生成單一 XML 文檔 |
| UriType 家族 | 存儲/查詢 URL 引用,含 HttpUriType、DBUriType 等子類型 |
CREATE TABLE warehouses (
warehouse_id NUMBER(3),
warehouse_spec SYS.XMLType,
warehouse_name VARCHAR2(35),
location_id NUMBER(4)
);
INSERT INTO warehouses VALUES (
1001,
SYS.XMLType.createXML('Owned ')
);
-- 查詢
SELECT w.warehouse_spec.extract('/Warehouse/Building/text()').getStringVal() "Building"
FROM warehouses w;
-- 更新
UPDATE warehouses SET warehouse_spec = SYS.XMLType.createXML(
'Leased '
);
-- 刪除
DELETE FROM warehouses e
WHERE e.warehouse_spec.extract('//Building/text()').getStringVal() = 'Leased';
XMLType 讓 Oracle 成為原生 XML 數據庫,結合 DBMS_XMLGEN、SYS_XMLGEN、SYS_XMLAGG 等工具,可實現從關係數據到 XML 的無縫雙向轉換,極大簡化了異構系統集成與數據交換開發。