【问题标题】:How to get formatted XML out of Oracle如何从 Oracle 中获取格式化的 XML
【发布时间】:2014-04-24 03:44:21
【问题描述】:

我对 Oracle 缺乏经验,并且无法将我的数据导出为 XML。我已经设法让这个查询工作,但 XML 的格式似乎是固定的,对我不起作用。这是查询:

SELECT value(em).getClobVal() AS "output"
    FROM table(XMLSequence(Cursor
      (   
          SELECT * FROM UserMain
       )
)) em

我从中得到的是:

  <ROW><STATUS>Active</STATUS><NAME>Joe Smith<NAME><PHONE>234-2345</PHONE>...</ROW>
  <ROW><STATUS>Inactive</STATUS><NAME>Sally Smith<NAME><PHONE>234-4444</PHONE>...</ROW>
  etc.

但我想要的是这样,在输出的外部带有 XML 标签“ROWS”,如下所示:

  <ROWS>
      <RECORD><STATUS>Active</STATUS><NAME>Joe Smith<NAME><PHONE>234-2345</PHONE>...</RECORD>
      <RECORD><STATUS>Inactive</STATUS><NAME>Sally Smith<NAME><PHONE>234-4444</PHONE>...</RECORD>
      etc.
  </ROWS>

那么我需要对我的查询做些什么来更改并在输出周围放置外部标签?

【问题讨论】:

    标签: sql xml oracle


    【解决方案1】:

    上面的答案工作正常,但这最终是我作为解决方案所采用的,因为它对于完整的实现来说更简单:

    select REPLACE(REPLACE(dbms_xmlgen.getxml
    ('Select * from USRMAIN'),'ROWSET','rows'),'ROW','records') 
     as output from dual
    

    数据/功能部分是这样的:

    select dbms_xmlgen.getxml('Select * from USRMAIN') output from dual
    

    这段代码基本上像游标一样工作,在内部为每个值添加“value”序列化查询的输出,在开头和结尾添加“”每行,加上

    然后我有效地将输出包装在两个 Replace() 语句中,以更改从 Oracle 数据中返回的默认标头。

    希望这对其他人有用......

    【讨论】:

    【解决方案2】:

    几年前我发现了一个技巧。如果您使用XMLTYPE 并使用Oracle transform 函数将一些XSL 模板应用于此XMLTYPE,则会出现意外行为:XML 被格式化。这是非常出乎意料的,从某些角度来看很有趣。

    这个procedure 成功了:

    procedure beautify(xmlout in out nocopy clob)
      is
        xml    xmltype := new xmltype(xmlout);
        xsl    xmltype := new xmltype('<?xml version="1.0" encoding="iso-8859-1"?><DOCUMENT></DOCUMENT>');
        tmp    xmltype;
    begin
      tmp := xml.transform(xsl,null);
      xmlout := xml.getclobval;
    
      if tmp is null then null; end if;
    end;
    

    当然,您应该将有效的XMLTYPE 传递给函数,例如在你的情况下,它应该是一种

    <?xml version="1.0" encoding="iso-8859-1"?>
    <DOCUMENT>
      <ROW><STATUS>Active</STATUS><NAME>Joe Smith<NAME><PHONE>234-2345</PHONE>...</ROW>
      <ROW><STATUS>Inactive</STATUS><NAME>Sally Smith<NAME><PHONE>234-4444</PHONE>...</ROW>
    </DOCUMENT>
    

    请注意,encoding="iso-8859-1" 用于德语,您应该更改它以使用适合您的编码。

    如果你想在查询中使用它,你可以创建一个function 而不是procedure。您也可以在格式化之前添加额外的行并在格式化之后将其删除。

    这在 Oracle 11.2 中运行良好

    【讨论】:

    • 酷。谢谢。让我试试看。
    • 只是为了告知这是设计使然。在 oracle 文档中,您将找到以下内容:XMLType methods (member functions) extract() and transform() always pretty-print.Link to Oracle documentation
    猜你喜欢
    • 2012-11-11
    • 1970-01-01
    • 2016-05-25
    • 2018-12-24
    • 1970-01-01
    • 1970-01-01
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多