我对 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)
那么我需要如何处理我的查询以更改并在输出周围放置外部标签?
几年前我发现了一个技巧。如果您使用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 中运行良好