如何使用Oracle 11g / DBMS_XMLGEN创建嵌套的XML文件?

时间:2012-09-25 12:43:38

标签: sql xml plsql

我正在使用Oracle 11g(11.1.0.7.0),我必须创建一个查询的XML文件。我在表单6中使用此文件,用户希望能够在表单中按下按钮时创建XML文件,因此我有一个PL / SQL包,用于创建带有XML数据的CLOB文件服务器和表单6i我读取此文件行的行(UTL_FILE.FOPEN读取它,行的UTL_FILE.GET_LINE)和TEXT_IO.PUT_LINE我在客户端计算机上写入文件。 这很好用,但我的XML文件有问题。 现在它看起来像这样(值是示例!):

<?xml version="1.0" encoding="ISO-8859-1" ?>
<ShoeShop>
  <Article>
    <Artnumber>12345</Artnumber>
    <Artdesc>Black Shoes</Artdesc>
  </Article>
  <Article>
    <Artnumber>12346</Artnumber>
    <Artdesc>White Shoes</Artdesc>
  </Article>
</ShoeShop>

确定。 我想创建一个类似于以下的XML文件,但我不知道如何!我是SQL / PLSQL的新手,我学习到2个月,在此之前我使用了Progress 4GL。所以在进行中我称之为“嵌套”我想做什么,但我不知道如何用SQL / PLSQL实现它。 XML-File的示例我想要的方式:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<ShoeShop>
  <Article="12345">
    <Artdesc>Black Shoes</Artdesc>
  </Article="12345">
  <Article="12346">
    <Artdesc>White Shoes</Artdesc>
  </Article="12346">
</ShoeShop>

用于创建XML-File的代码片段,它看起来像第一个示例:

PROCEDURE XML_TO_CLOB( pi_Query      IN VARCHAR2,
                       pi_ParentNode IN VARCHAR2,
                       pi_ChildNode  IN VARCHAR2 ) IS
  qryCtx DBMS_XMLGEN.ctxHandle;
  cResult CLOB;
BEGIN
-- Create new Context for the Query
  qryCtx := DBMS_XMLGEN.newContext( pi_Query );

-- Set Parent and Child Node
  DBMS_XMLGEN.setRowSetTag( qryCtx, pi_ParentNode );
  DBMS_XMLGEN.SetRowTag( qryCtx, pi_ChildNode );

-- setNullHandling to show Tag also when the value is NULL
  DBMS_XMLGEN.setNullHandling( qryCtx, DBMS_XMLGEN.EMPTY_TAG );

-- getXML in CLOB
  cResult := DBMS_XMLGEN.getXML( qryCtx );

-- Put encoding to the "Header"
  cResult := REPLACE( cResult, '<?xml version="1.0"?>', '<?xml version="1.0" encoding="ISO-8859-1" ?>' );

-- Close Context
  DBMS_XMLGEN.closeContext( qryCtx );

-- Write the CLOB to a file on the server to work with the data in Forms 6i
  DBMS_XMSLPROCESSOR.CLOB2FILE( cResult, 'ExampleDir', 'Example.xml' );
END;

非常感谢,

萨拉

1 个答案:

答案 0 :(得分:1)

有一些使用DBMS_XMLGEN在文档中生成嵌套文档的示例。 Check out example 17-27

Oracle解决方案涉及使用用户定义的类型来指定文档的形状,包括将作为属性而不是元素包含的列。这可能比您预期的更多基础设施。