SYS_CONNECT_BY_PATHを使用して文字列の集計を行っています。クエリの一般的な形状は次のようになります。
select /*a bunch of fields unrelated to the problem*/,
--Use SYS_CONNECT_BY_PATH to glue together all the chunks of XML.
--The XSL header and footer are prepended and appended here.
, XMLType(to_clob('<?xml version="1.0"?><!-- begining of XSL file -->,'<!-- Next Section -->'))||'</xsl:stylesheet>')) AS XSL
from (
select /*a bunch of fields unrelated to the problem*/
case when x = 1 then to_clob('
/*a bunch of XSL*/
<xsl:text>'||subq.new_c_value||'</xsl:text>
/*a whole bunch more xsl*/')
else
to_clob('/*a bunch of different XSL*/
<xsl:text>'||subq.new_f_value||'</xsl:text>
/*a whole bunch more xsl*/')
end as xsl,
--curr and prev are to help with using sys_connect_by_path do string aggregation.
rownum AS curr,
rownum -1 AS prev
from (Select /* details of subq not relevant */ ) as subq
)
CONNECT BY prev = PRIOR curr
START WITH curr = 1;
基本的に、XMLファイルの修正に使用されるXSLを生成するクエリを実行しています。sys_connect_by_pathを使用して、文字列を1つのチャンクに結合しています。これは、多くの行から多くの値をコピーして貼り付けるよりも簡単です。このクエリは本番データベースで実行されるため、カスタム文字列集計関数を使用できません。本番データベースでは、必要に応じて関数を作成することができません。
問題は、クエリを実行すると次のように返されることです。
ORA-01489:文字列連結の結果が長すぎます 01489.00000-「文字列連結の結果が長すぎます」 *原因:文字列連結の結果が最大サイズを超えています。 *アクション:結果が最大サイズよりも小さいことを確認してください。
...データが多すぎる場合。ご覧のとおり、私はこのto_clob()
関数を役立つと思うところならどこにでも適用してきましたが、それほど大きな違いはないようです。PL / SQLに頼る以外に、これを処理する他の方法はありますか?このクエリの結果は、XSLと並べていくつかの有用な情報を表示するレポートテンプレートにエクスポートされるため、これをクエリとして保持することをお勧めします。これらすべてを、複数のステップではなく、1つのステップで実行できると便利です。
(Oracle 10g)
最終的に、私はこのページを見つけました:
http://www.sqlsnippets.com/en/topic-11787.html
Oracleの文字列集約手法について。私の状況で機能するのは、XMLメソッドとModelメソッドだけだと思います。モデルメソッドを正しく機能させることができなかったので、XMLメソッドを使用しました。