跳轉至內容

Oracle 資料庫/XML 管理

來自華夏公益教科書

Oracle 擁有各種強大的 XML 功能。關於 Oracle 的 XML 功能存在大量文件。本資源旨在成為那些沒有時間閱讀數百頁文件,而是希望快速瞭解如何建立簡單的 XML 輸出並將 XML 輸入資料庫的使用者的備忘單。

DBMS_XMLGEN

[編輯 | 編輯原始碼]

透過獲取指定的最大行數來獲取 XML 文件。它將 XML 文件追加到傳入的 CLOB。使用此版本的 GETXML 函式可以避免任何額外的 CLOB 複製並重復使用同一個 CLOB 進行後續呼叫。由於 CLOB 重複使用,此 GETXML 函式呼叫可能更高效。

語法

DBMS_XMLGEN.GETXML (
  ctx          IN ctxHandle, 
  tmpclob      IN OUT NCOPY CLOB,
  dtdOrSchema  IN number := NONE)
RETURN BOOLEAN;

生成 XML 文件並將其作為臨時 CLOB 返回。從該函式獲得的臨時 CLOB 必須使用 DBMS_LOB.FREETEMPORARY 呼叫釋放

DBMS_XMLGEN.GETXML (
  ctx          IN ctxHandle,
  dtdOrSchema  IN number := NONE)
RETURN CLOB;

將 SQL 查詢字串的結果轉換為 XML 格式,並將 XML 作為臨時 CLOB 返回,該 CLOB 必須隨後使用 DBMS_LOB.FREETEMPORARY 呼叫釋放

DBMS_XMLGEN.GETXML (
  sqlQuery     IN VARCHAR2,
  dtdOrSchema  IN number := NONE)
RETURN CLOB;


示例

以下過程將員工表中的欄位解析為 XML,並將 XML 作為 CLOB 行儲存在表中。

CREATE OR REPLACE procedure dump_pcd AS
    qryCtx DBMS_XMLGEN.ctxHandle;
    result CLOB;
BEGIN
    qryCtx :=  dbms_xmlgen.newContext ('SELECT * from employees;');
    DBMS_XMLGEN.setRowTag(qryCtx, 'EMPLOYEE'); DBMS_XMLGEN.setMaxRows(qryCtx, 5);
    LOOP

        -- save the XML into the CLOB result.
        result :=  DBMS_XMLGEN.getXML(qryCtx);
        EXIT WHEN DBMS_XMLGEN.getNumRowsProcessed((qryCtx)=0);
 
        -- store the data to a temporary table
        INSERT INTO temp_clob_tab VALUES(result);

    END LOOP;
END dump_pcd;

setRowSetTag()

[編輯 | 編輯原始碼]

設定文件的根元素的名稱。預設名稱為 ROWSET。將 rowSetTag 設定為 NULL 將停止輸出此元素。如果 row 和 rowset 均為 NULL 且輸出中有多個列或行,則會產生錯誤。產生錯誤是因為生成的 XML 將沒有頂級封閉標籤。

語法

DBMS_XMLGEN.setRowSetTag ( 
  ctx        IN ctxHandle,  
  rowSetTag  IN VARCHAR2);

示例

DBMS_XMLGEN.setRowSetTag ( ctxHandle, 'ALL ROWS' );

示例輸出

這將整個 XML 結果集包含在第二個引數指定的標籤中。

<ALL ROWS>
  <ROW>
     <NAME>John Doe</NAME>
  </ROW>
  <ROW>
     <NAME>Jane Doe</NAME>
  </ROW>
  ...
</ALL ROWS>

setRowTag()

[編輯 | 編輯原始碼]

此函式設定每行的元素的名稱。預設名稱為 ROW。將其設定為 NULL 會抑制 ROW 元素本身。如果 row 和 rowset 均為 NULL 且輸出中有多個列或行,則會產生錯誤。返回錯誤是因為生成的 XML 必須具有頂級封閉標籤。

語法

DBMS_XMLGEN.setRowTag ( 
  ctx        IN ctxHandle,  
  rowTag     IN VARCHAR2);

示例

這告訴 XML 生成器將每行的列包含在 AUTHOR 標籤中。

DBMS_XMLGEN.setRowTag ( ctxHandle, 'AUTHOR' );

示例輸出

現在每個輸出行都包含在 AUTHOR 標籤中。

<ROWSET>
  <AUTHOR>
     <NAME>John Doe</NAME>
  </AUTHOR>
  <AUTHOR>
     <NAME>Jane Doe</NAME>
  </AUTHOR>
  ...
</ROWSET>

將查詢結果轉儲為 XML

[編輯 | 編輯原始碼]

將 SQL 查詢結果轉儲為 XML 的示例過程。

CREATE OR REPLACE procedure dump_pcd AS
    qryCtx DBMS_XMLGEN.ctxHandle;
    result CLOB;
BEGIN
    qryCtx :=  dbms_xmlgen.newContext ('SELECT * from employees;');
    DBMS_XMLGEN.setRowTag(qryCtx, 'EMPLOYEE'); DBMS_XMLGEN.setMaxRows(qryCtx, 5);
    LOOP
        result :=  DBMS_XMLGEN.getXML(qryCtx);
        EXIT WHEN DBMS_XMLGEN.getNumRowsProcessed((qryCtx)=0);
        INSERT INTO temp_clob_tab VALUES(result);
    END LOOP;
END dump_pcd;

返回的 XML 結果將類似於以下內容

<?xml version=''1.0''?>
 <ROWSET>
  <EMPLOYEE>
    <EMPLOYEE_ID>30</EMPLOYEE_ID>
    <LAST_NAME>SCOTT</LAST_NAME>
    <SALARY>20000<SALARY>
  </EMPLOYEE>
  <EMPLOYEE>
    <EMPLOYEE_ID>31</EMPLOYEE_ID>
    <LAST_NAME>MARY</LAST_NAME>
    <AGE>25</AGE>
  </EMPLOYEE>
</ROWSET>
華夏公益教科書