1

を使用して生成された XML

XMLAgg(XMLElement('student', ...)...)

すべてを 1 行に吐き出します。テーブルが非常に大きいため、スプール時に行の長さの制限に達します。

各 <student>...</student> ノードを別の行に配置したいと思います。このページでは、XMLText(x'0A') を使用して新しい行を挿入することを提案していますが、SQLPlus はそれを認識していないようです。

私はすでに試しました:

set long 2000000000
set linesize 32767
set wrap on
set trimspool on
4

1 に答える 1

4

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

于 2013-01-25T07:46:11.143 に答える