Oracle Database 10g Release 2 引入了與資料庫深度整合的全功能 XQuery 引擎,開發人員可直接在資料庫層處理 XML 資料模型。XQuery 不僅能查詢 XML,更能操作任何可用 XML 表示的資料。雖然 Oracle XQuery 支援存取資料庫資料與外部資料源,但針對資料庫中儲存的結構化資料,Oracle XML DB 通常能提供顯著的效能優勢。
在需要將關聯式資料轉換為 XML 格式時(例如呼叫 Web Service),Oracle 10g R2 之前版本通常使用 XMLElement、XMLForest、XMLAgg() 等 SQL/XML 生成函數。而在 10g R2 中,XQuery 配合 ora:view 函數,能更高效地直接查詢現有關聯式表或視圖並即時構建 XML,無需顯式建立 XML 視圖。
以下 PL/SQL 區塊示範如何在 XML DB Repository 中建立資料夾並儲存產生的 XML 文件:
BEGIN
IF (DBMS_XDB.CREATEFOLDER('/public/employees')) THEN
DBMS_OUTPUT.PUT_LINE('Folder is created');
ELSE
DBMS_OUTPUT.PUT_LINE('Cannot create folder');
END IF;
COMMIT;
END;
/
DECLARE
XMLdoc XMLType;
BEGIN
SELECT XMLQuery(
'for $j in 1
return (
{
for $i in ora:view("HR", "employees")/ROW
where $i/EMPLOYEE_ID <= 102
return (
{xs:string($i/EMPLOYEE_ID)}
{xs:string($i/LAST_NAME)}
{xs:integer($i/SALARY)}
)
}
)'
RETURNING CONTENT) INTO XMLdoc FROM DUAL;
IF (DBMS_XDB.CREATERESOURCE('/public/employees/employees.xml', XMLdoc)) THEN
DBMS_OUTPUT.PUT_LINE('Resource is created');
ELSE
DBMS_OUTPUT.PUT_LINE('Cannot create resource');
END IF;
COMMIT;
END;
/
執行後可透過 fn:doc 查詢驗證結果:
SELECT XMLQuery('for $i in fn:doc("/public/employees/employees.xml")
return $i'
RETURNING CONTENT) AS RESULT FROM DUAL;
輸出將包含前三筆員工資料的 XML 結構。
XQuery 同時支援基於 XML Schema 與非 Schema 的資料操作。以下範例使用 XMLTable 函數從 OE 範例結構的 PurchaseOrder XMLType 表中查詢特定使用者的訂單總額:
SELECT ttab.COLUMN_VALUE AS OrderTotal
FROM PurchaseOrder,
XMLTable(
'for $i in /PurchaseOrder
where $i/User = "EABEL"
return
{$i/Reference}
{fn:sum(for $j in $i/LineItems/LineItem/Part
return ($j/@Quantity * $j/@UnitPrice))}
'
PASSING OBJECT_VALUE
) ttab;
此查詢利用 OBJECT_VALUE 虛擬欄位傳遞上下文項,計算每筆訂單的總金額並產生 OrderTotal 元素。若改用 XMLQuery 需注意空序列處理,可搭配 existsNode 於 WHERE 子句過濾。
當需處理同一資料夾下結構相似的多份 XML 文件時,fn:collection 函數可一次存取整個集合,後續章節將詳細示範其用法。