Oracle - ORA-01489: 文字列の連結の結果が長すぎます。
ソース・テーブルから2つのフィールドを連結した1つのフィールド(6個中)を持つビューを作成した。 2つ目のビューを作成し、listaggを使用して連結の結果を結合する可能性があります。 この2段階の操作を行うと、ソーステーブルから2つのフィールドを連結したlistaggが正しく返されます。
連結と listagg の両方を生成するビューを 1 つ作成しようとすると、Oracle エラー ora-01489 Result of string concatenation is too long が表示されます。
試しに max(length(concatenated field)) を選択したところ、837 が返されました。 つまり、記載されているエラーは誤りであるようです。
ということは、構文に問題があるのでしょう。 rtrim、trim、substrも試しましたが、ビューステートメントでlistagg(concatenation)のコンパイルとデータの返却の両方を行うことはできません。
データを正しく返す2つのビューを開発できたということは、基本的な構文は理解できたということですが、連結とlistagg関数を組み合わせる作業は理解できていません。
別の場面では、連結とlistagg関数を1つのステートメントで結合することができました。
LISTAGG (STATEMENTS || ' - ' || BIRTH_DATE, '; ')
WITHIN GROUP (ORDER BY STATEMENTS || ' - ' || BIRTH_DATE)
AS GROWING_UP
この構文は、正しく目的のデータを返してくれます............。
しかし、上記のような状況では、同様の構文でOra-01489エラーが発生します。
Oracleのエラーは時に誤解を招くことがありますが、Oracleがこのエラーを出す理由を、記載されているもの以外にご存知の方はいらっしゃいますか?
LISTAGG ((NUMBER || '-' || text), ',') WITHIN GROUP (ORDER BY (NUMBER || '-' || text))
AS
restrictions FROM source
はエラーを返します
11
1
LISTAGG`にも適用されるSQLの制限である4000バイトを超えています。
回避策として、XMLAGG を使用することができます。
例えば
複数のカラムを 4000 bytes で連結したい場合は、各カラムの XMLAGG 出力を連結することで、SQL の 4000 bytes の制限を回避することが可能です。
例えば、以下のようになります。