使用DBMS_XMLGEN.getxml和Cursor表达式时,是否可以删除额外的XML嵌套?

时间:2011-12-02 00:08:48

标签: oracle oracle10g

我一直在搜索文档和谷歌,但我似乎无法找到我要找的东西;我的oracle版本是10.2.0.5。

让我们使用这个简单的查询:

select dbms_xmlgen.getxml('select cursor(select ''1'' "one", ''2''
"two", ''3'' "three" from dual) "numbers" from dual') from dual;

结果是:

"<?xml version="1.0"?>
<ROWSET>
 <ROW>
  <numbers>
   <numbers_ROW>
    <one>1</one>
    <two>2</two>
    <three>3</three>
   </numbers_ROW>
  </numbers>
 </ROW>
</ROWSET>
"

问题1:为什么在“数字”足够时(至少就我的目的而言)是否会创建“numbers_row”?

问题2:我可以使用xmlgen包或其他包来摆脱额外的嵌套吗?我正在使用正则表达式,但这似乎有点不合理。

谢谢你, -joel

1 个答案:

答案 0 :(得分:2)

您需要阅读这篇文章: http://www.orafaq.com/wiki/DBMS_XMLGEN

它解释了如何更改DBMS_XMLGEN包生成的Oracle默认名称。

问题1的答案是:它是Oracle DBMS_XMLGEN包的默认值和行为

对于问题2:您需要调用一些额外的DBMS_XMLGEN过程来更改默认值,因此您需要使用PL / SQL:

DECLARE
   ctx DBMS_XMLGEN.ctxHandle;
   xml CLOB;
BEGIN
   ctx := dbms_xmlgen.newcontext('select ''1'' "one", ''2'' "two", ''3'' "three" from dual');
   dbms_xmlgen.setRowTag(ctx, 'NUMBERS');
   xml := dbms_xmlgen.getxml(ctx);
   dbms_output.put_line(substr(xml,1,255));
END;

输出:

<?xml version="1.0"?>
<ROWSET>
 <NUMBERS>
  <one>1</one>
  <two>2</two>
  <three>3</three>
 </NUMBERS>
</ROWSET>

有一些程序可以用更有意义的东西替换<ROWSET>值。

希望它有所帮助...