3

以下のSQLを実行してテーブルビューを作成しようとしています

  SELECT   IACM1.CMNT_REAS_TYP,
           TO_CLOB(LPAD (
                      LISTAGG (IACM1.CMNT_TXT, ' ')
                         WITHIN GROUP (ORDER BY IACM1.LN_NUM),
                      4000,
                      LISTAGG (IACM1.CMNT_TXT, ' ')
                         WITHIN GROUP (ORDER BY IACM1.LN_NUM)
                   ))
    FROM   FT_T_IACM IACM1, FT_T_IACM IACM2
   WHERE   IACM1.ISSACT_ID = IACM2.ISSACT_ID
           AND IACM1.CMNT_REAS_TYP = IACM2.CMNT_REAS_TYP
GROUP BY   IACM1.cmnt_reas_typ;

しかし、私はerror以下を取得しています

ORA-01489:文字列連結の結果が長すぎます01489。00000-"文字列連結の結果が長すぎます"*原因:文字列連結の結果が最大サイズを超えています。*アクション:結果が最大サイズよりも小さいことを確認してください。

調べて、to_clobを使用するための提案を見つけましたが、それでもこのエラーがスローされます。私はオラクル11gを使用しています。よろしくお願いします。

4

2 に答える 2

3

LISTAGGで連結された文字列の最長は4000文字です。このクエリでは、1つ以上のCMNT_REAS_TYP値のCMNT_TXTの長さの合計が4000を超えているように見えます。LISTAGGは、LPADが文字列を4000文字に切り捨てる前に文字列を作成します。したがって、この場合、LPADは効果がありません。また、LISTAGGは他の何かが発生する前にvarchar2に移動するため、TO_CLOBは影響を与えません。

これを修正する1つの方法は、可能であればGroupByに追加のフィールドを配置することです。それが不可能な場合は、LISTAGGの代わりにCOLLECTを使用してみてください。データ型を一致させる際にさらに問題が発生しますが、実行可能です。

LISTAGGとCOLLECTのいくつかの比較と、COLLECTの使用方法に関する少しのリンクを次に示します。http ://www.oracle-developer.net/display.php?id = 515

于 2012-11-15T17:27:20.570 に答える
2

カスタム関数を作成する必要はありません。Oracleは、それを行うためのxmlagg関数をすでに提供しています。

必要なのは、GetClobValによって出力をclobに変換することだけです。また、結果の最後に区切り文字が返されるため、rtrimする必要があります。

SELECT RTRIM(XMLAGG(XMLELEMENT(E,colname,',').EXTRACT('//text()') ORDER BY colname).GetClobVal(),',') from tablename;
于 2015-03-13T10:57:55.663 に答える