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 で短くなります。