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>