LISTAGGを使って検索結果を横並びに出力する事ができますが、検索結果が4000バイトを超えるとエラー「ORA-01489: 文字列を連結した結果、長さが最大長を超えました」が発生します。
4000バイトを超えるデータを扱う場合はXMLAGGを使う必要があります。
XMLAGGという関数を使えば、結果をCLOB型(上限4GB)で返却してくれるので、ほぼ上限を気にせず使えると思います。
前提条件
NAMEは4000バイトを超えている状態のデータを用意します。
-- テーブル定義 DESC TB_SAMPLE 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- ID VARCHAR2(4) DEPT VARCHAR2(10) NAME VARCHAR2(2000) -- NAMEが4000バイトを超えている SELECT DEPT , SUM(LENGTHB(NAME)) FROM TB_SAMPLE GROUP BY DEPT ; DEPT SUM(LENGTHB(NAME)) -------------------- ------------------ 管理部 24 人事部6000
LISTAGGで4000バイトを超えるデータを横並び出力
LISTAGGを使うとエラーになってしまいます。
SELECT DEPT , LISTAGG(NAME, ',') WITHIN GROUP (ORDER BY NAME) NAME FROM TB_SAMPLE GROUP BY DEPT ; 行1でエラーが発生しました。:ORA-01489: 文字列を連結した結果、長さが最大長を超えました
XMLAGGで4000バイトを超えるデータを横並び出力
XMLAGGを使えば、4000バイトを超えるデータも正しく出力できます。
CLOB型を出力するのでSET LONGを指定しておかないと文字切れが発生しますので、気を付けて下さい。
SET LONG 2000000000 SELECT RTRIM( XMLAGG( XMLELEMENT(e, NAME || ',').EXTRACT('//text()') ).GetClobVal(), ',' ) AS RESULT FROM TB_SAMPLE ; ~検索結果は省略~