2012-05-02 2 views
2

私は文字列集約を行うために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メソッドを使いました。

+1

これは厳しいものです。 [トピックに関する興味深いフォーラムの記事はこちら](https://forums.oracle.com/forums/thread.jspa?threadID=963324) 1つの答えを引用する: "* SYS_CONNECT_BY_PATHを使用してサブクエリの文字列の一部を作成し、それらの部分をメインクエリのCLOBに連結することができます。がんばろう! –

答えて

1
select 
    xmlroot 
    (
     xmlelement 
     (
      "xsl:stylesheet" 
      ,XMLAttributes 
      (
       '1.0' as version 
       ,'http://www.w3.org/1999/XSL/Transform' as "xmlns:xsl" 
       ,'http://test' as "xmlns:ns0" 
      ) 
      ,(
       xmlagg(xmlelement("xsl:text", val)) 
      ) 
     ) 
     ,version '1.0' 
    ) 
from 
(
    --Test >4000 characters 
    select 1 id, cast(rpad('a',4000,'a') as varchar2(4000)) val from dual union all 
    select 1 id, cast(rpad('b',4000,'b') as varchar2(4000)) val from dual union all 
    select 1 id, cast(rpad('c',4000,'c') as varchar2(4000)) val from dual union all 
    select 1 id, cast(rpad('d',4000,'d') as varchar2(4000)) val from dual 
); 
+0

これは機能しているようですが、レポートデータ用とxmlaggの2つのクエリがあります。それは他の方法がないかもしれない... – FrustratedWithFormsDesigner

0

申し訳ありませんが私の答えは、文字列の集計パッケージの作成に依存しているが、長期的 あなたが代わりにその中に、下記のリンク

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:2196162600402

にAskTomで言及SYS_CONNECT_BY_PATH のStraggパッケージを使用することができますに役に立つかもしれませんパッケージには、あなたのニーズに応じてCLOBを処理するために変更できる宣言と長いロジックがあります。

+0

これはおそらく動作しますが、実動データを報告する目的で本番サーバーに対してこの問合せを実行しています。プロダクションサーバーなので、私の報告の都合上、新しいパッケージをコンパイルするだけでは不十分です。 – FrustratedWithFormsDesigner