跳转至内容

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>
华夏公益教科书