zukucode
主にWEB関連の情報を技術メモとして発信しています。

Oracle LISTAGG関数の注意点とエラー時の対処法

LISTAGG関数を使用する際の注意点とよくあるエラーの対処法を紹介します。

複数行の値をグループ化してカンマ区切りで取得したい時などにLISTAGG関数を使用することがあります。

col1
val1
val2
val3
SELECT
    LISTAGG(col1, ',') WITHIN GROUP (ORDER BY col1) result
FROM
    table1
結果
result
val1,val2,val3

注意点

LISTAGG関数は以下の点に注意が必要です。

11gR2から使用可能

LISTAGG関数はOracleのバージョンが11gR2から使用可能です。

10g11gR1では動作しません。特に11gR1R2のマイナーバージョンの違いで使用可能かどうかが変わってきてしまうので、注意が必要です。

連結した文字列が4000バイトを超えるとエラーになる

Oracleで扱える文字列は4000バイトのため、連結した文字列が4000バイトを超える場合は以下のエラーが発生します。

ORA-01489: 文字列を連結した結果、長さが最大長を超えました
ORA-01489: result of string concatenation is too long

対処法

LISTAGG関数の代わりにXMLAGG関数を使用すれば上記の問題点を解決できます。

SELECT
    RTRIM(XMLAGG(XMLELEMENT(e, col1 || ',').EXTRACT('//text()')).GetClobVal(), ',') result
FROM
    table1
結果
result
val1,val2,val3

XMLAGG11gR2以外のバージョンでも使用できます。

GetClobValで連結した文字列を明示的にCLOB型に変換することにより、4000バイト以上の文字列を扱うことができるようになります。


関連記事