如何从 Oracle 中获取格式化的 XML

Bri*_*ian 2 xml sql oracle

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

SELECT value(em).getClobVal() AS "output"
    FROM table(XMLSequence(Cursor
      (   
          SELECT * FROM UserMain
       )
)) em
Run Code Online (Sandbox Code Playgroud)

我从中得到的是:

  <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.
Run Code Online (Sandbox Code Playgroud)

但我想要的是这样,在输出的外部带有 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>
Run Code Online (Sandbox Code Playgroud)

那么我需要如何处理我的查询以更改并在输出周围放置外部标签?

smn*_*brv 5

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

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;
Run Code Online (Sandbox Code Playgroud)

当然,你应该传递给函数一个 valid 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>
Run Code Online (Sandbox Code Playgroud)

请注意,encoding="iso-8859-1"它用于德语,您应该将其更改为根据您的目的使用编码。

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

这在 Oracle 11.2 中运行良好