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

a7qyws3x  于 2023-02-03  发布在  Oracle
关注(0)|答案(2)|浏览(220)

我对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>

那么,我需要对查询做些什么才能更改为输出并在输出周围放置外部标记呢?

b91juud3

b91juud31#

几年前我发现了一个技巧,如果使用XMLTYPE并使用Oracle transform函数将一些XSL模板应用到XMLTYPE,则会出现意外行为:XML被格式化了。这是非常出乎意料的,从某种Angular 来说很有趣。
这个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中运行良好

lmvvr0a8

lmvvr0a82#

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

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

这段代码基本上像游标一样工作,序列化内部查询的输出,为每个值添加“< fieldname>value< /fieldname>“,< ROW>< /ROW>在每行的开头和结尾加上““< ROWSET>< /ROWSET>。
然后,我有效地将输出 Package 在两个Replace()语句中,以更改Oracle数据中返回的默认标头。
希望这对其他人有用...

相关问题