首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle XQuery 查詢、構建與轉換 XML 完全指南 (1)

     編輯:Oracle 資料庫基礎

Oracle 10g R2 內建 XQuery 引擎簡介

Oracle Database 10g Release 2 引入了與資料庫深度整合的全功能 XQuery 引擎,開發人員可直接在資料庫層處理 XML 資料模型。XQuery 不僅能查詢 XML,更能操作任何可用 XML 表示的資料。雖然 Oracle XQuery 支援存取資料庫資料與外部資料源,但針對資料庫中儲存的結構化資料,Oracle XML DB 通常能提供顯著的效能優勢。

基於關聯式資料構建 XML

在需要將關聯式資料轉換為 XML 格式時(例如呼叫 Web Service),Oracle 10g R2 之前版本通常使用 XMLElement、XMLForest、XMLAgg() 等 SQL/XML 生成函數。而在 10g R2 中,XQuery 配合 ora:view 函數,能更高效地直接查詢現有關聯式表或視圖並即時構建 XML,無需顯式建立 XML 視圖。

範例:使用 ora:view 從 HR.employees 表產生 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 結構。

查詢 XMLType 資料

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

當需處理同一資料夾下結構相似的多份 XML 文件時,fn:collection 函數可一次存取整個集合,後續章節將詳細示範其用法。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved