2016-09-28 20 views
0

長すぎる:ORA-01489:Oracleの - ORA-01489:文字列連結の結果は、私はこのクエリ上で動作し、このエラーを取得する

Oracle - ORA-01489: result of string concatenation is too long

いくつかのいずれかがこの問題に

SELECT LISTAGG(RCRDNUM) WITHIN GROUP (ORDER BY RCRDNUM) 
FROM (SELECT (ERR.RCRDNUM || ',') AS RCRDNUM 
     FROM TABLENAME ERR 
     INNER JOIN (SELECT UPPER(REGEXP_SUBSTR('No value present for CNTRY_CD column for the record', 
              '[^,]+', 1, LEVEL)) ERR_MSG 
        FROM DUAL 
        CONNECT BY REGEXP_SUBSTR('No value present for CNTRY_CD column for the record', 
              '[^,]+', 1, LEVEL) 
         IS NOT NULL) ERRMSG_P 
     ON (UPPER(ERR.ERRMSG) = ERRMSG_P.ERR_MSG 
      OR 'No value present for CNTRY_CD column for the record' IS NULL)) 
を解決するために助けてください
+1

はあなた 'listagg'潜在的に4000文字以上の結果か?もしそうなら、 'listagg'を使うことはできません(または、返される行の数を減らすインラインビューにフィルタを用意する必要があります)。より長い文字列を生成する必要がある場合は、 'clob'データ型を扱う独自の集約関数を書くことができます(オンラインの実装がいくつかあります)。 –

+0

@JustinCave - ...または 'xmlagg()'を使う – mathguy

答えて

0

OracleのSQLクエリでは、文字列(VARCHAR型の列)は4000文字に制限されています。明らかに、クエリはより長い文字列を作成するため、失敗します。これは簡単にLISTAGGで発生します。

あなたのクエリは本当にそのような長い文字列を返すべきですか?そうでない場合は、クエリを処理する必要があります。

実際に4000文字を超える値が必要な場合は、カスタムのユーザー定義集計関数を使用してVARCHARのかわりにCLOBを使用できます。 Tom Kyteは彼の質問の1つにexampleを持っています。

0

集約リストが4000文字より長い文字列の場合、文字列はCLOBである必要があり、listagg()は使用できません。ただし、4000文字の制限がないxmlagg()を使用できます。結果はCLOBでなければならず、ソリューション内ではCLOBとしてキャストされます。

。ここに概念実証があります。私はあなたの状況にそれを適応させるでしょう。

with a (id,val) as (select 10, 'x' from dual union all select 20, 'abc' from dual) 
select listagg(val, ',') within group (order by id) as l_agg, 
     rtrim(xmlcast(xmlagg(xmlelement(e, val || ',') order by id) as clob), ',') 
     as clob_agg 
from a 
; 

出力

L_AGG  CLOB_AGG 
---------- ---------- 
x,abc  x,abc 
関連する問題