私は文字列集約を行うためにSYS_CONNECT_BY_PATHを使用しています。クエリの一般的な形状は、次のようなものです。SYS_CONNECT_BY_PATHは「ORA-01489:文字列連結の結果が長すぎます」
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: result of string concatenation is too long 01489. 00000 - "result of string concatenation is too long" *Cause: String concatenation result is more than the maximum size. *Action: Make sure that the result is less than the maximum size.
...あまりにも多くのデータがある場合には:
問題は、私のクエリを実行すると返されるということです。ご覧のとおり、to_clob()
機能をどこにでも適用していますが、それは大きな違いはありませんでした。 PL/SQLに頼る以外にこれを処理する他の方法はありますか?このクエリの結果は、XSLと並んで多数の有用な情報を示すレポートテンプレートにエクスポートされるため、これをクエリとして保持することをお勧めします。いくつかのステップではなく、1つのステップでこれをすべて実行できるのはうれしいことです。
(Oracle 10gの)
は最終的に、私は、このページを発見:Oracleでの文字列のアグリゲーション技術に関する
http://www.sqlsnippets.com/en/topic-11787.html
。自分の状況で動作するのは、XMLメソッドとModelメソッドだけです。モデルメソッドを正しく動作させることができなかったので、私はXMLメソッドを使いました。
これは厳しいものです。 [トピックに関する興味深いフォーラムの記事はこちら](https://forums.oracle.com/forums/thread.jspa?threadID=963324) 1つの答えを引用する: "* SYS_CONNECT_BY_PATHを使用してサブクエリの文字列の一部を作成し、それらの部分をメインクエリのCLOBに連結することができます。がんばろう! –