10g 中的常用技巧是添加.extract('/*')
您正在执行的外部 xml 操作,例如
xmlagg(....).extract('/*')
但这在 11g 中不起作用。对于使用 xsl 转换的跨版本兼容的版本,请参阅使用Oracle 数据库表中的自定义 XML 标记生成 XML 文件。
10.2.0.4:
SQL> create table foo (id) as select rownum from dual connect by level <= 2;
Table created.
SQL> select xmlagg(xmlelement("id", xmlelement("id2", id))).extract('/*') a from foo;
A
--------------------------------------------------------------------------------
<id>
<id2>1</id2>
</id>
<id>
<id2>2</id2>
</id>
SQL> select xmlserialize(content xmlagg(xmlelement("id", xmlelement("id2", id))).extract('/*') indent) a from foo;
select xmlserialize(content xmlagg(xmlelement("id", xmlelement("id2", id))).extract('/*') indent) a from foo
*
ERROR at line 1:
ORA-00907: missing right parenthesis
SQL> select xmlagg(xmlelement("id", xmlelement("id2", id))).transform(xmltype('<xsl:stylesheet version="1.0"
2 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
3 <xsl:output omit-xml-declaration="yes" indent="yes"/>
4 <xsl:template match="node()|@*">
5 <xsl:copy>
6 <xsl:apply-templates select="node()|@*"/>
7 </xsl:copy>
8 </xsl:template>
9 </xsl:stylesheet>')) a from foo;
A
--------------------------------------------------------------------------------
<id>
<id2>1</id2>
</id>
<id>
<id2>2</id2>
</id>
和 11.2.0.2/3:
SQL> select xmlagg(xmlelement("id", xmlelement("id2", id))).extract('/*') a from foo;
A
--------------------------------------------------------------------------------
<id><id2>1</id2></id><id><id2>2</id2></id>
SQL> select xmlserialize(content xmlagg(xmlelement("id", xmlelement("id2", id))).extract('/*') indent) a from foo;
A
--------------------------------------------------------------------------------
<id>
<id2>1</id2>
</id>
<id>
<id2>2</id2>
</id>
SQL> select xmlagg(xmlelement("id", xmlelement("id2", id))).transform(xmltype('<xsl:stylesheet version="1.0"
2 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
3 <xsl:output omit-xml-declaration="yes" indent="yes"/>
4 <xsl:template match="node()|@*">
5 <xsl:copy>
6 <xsl:apply-templates select="node()|@*"/>
7 </xsl:copy>
8 </xsl:template>
9 </xsl:stylesheet>')) a from foo;
A
--------------------------------------------------------------------------------
<id>
<id2>1</id2>
</id>
<id>
<id2>2</id2>
</id>
简而言之,要执行此版本不可知论,您应该使用 XSL。如果您只是尝试将其用于临时内容,那么extract
在 10g 上键入xmlserialize
更短,在 11g 上更短。