Oracle 資料庫/XML 管理
Oracle 擁有各種強大的 XML 功能。有關 Oracle 的 XML 功能,存在大量文件。本資源旨在作為那些沒有時間通讀數百頁文件的使用者的速查表,而是希望快速瞭解如何建立簡單的 XML 輸出並將 XML 輸入到資料庫中。
透過獲取指定的最大行數來獲取 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;
設定文件根元素的名稱。預設名稱為 ROWSET。將 rowSetTag 設定為 NULL 將阻止此元素輸出。如果行和行集都為 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>
此函式設定每行元素的名稱。預設名稱為 ROW。將其設定為 NULL 將抑制 ROW 元素本身。如果行和行集都為 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>
將 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>