본문 바로가기

[ORACLE] ORA-01489 문자열 연결의 결과가 너무 깁니다.

쿼리에서 LISTAGG 사용하다가 다음과 같은 에러가 발생할 때가 있다.

LISTAGG가 VARCHAR2(4000)를 초과하였을 때 발생하는 에러이다.

해결방안

LISTAGG를 사용하기 전에 중복된 값이 들어갔는지 확인해보자.

1. 중복된 값이 필요 없다면 스칼라 쿼리를 이용하여 LISTAGG의 길이를 줄이는 방법이 있다.

SELECT LISTAGG(A.STUDENT_NO , ',')
FROM   ( SELECT DISTINCT A.STUDENT_NO
		   FROM DEPT A
          WHERE A.REG_DTIME >= TRUNC(SYSDATE - 3) )

 

2. LISTAGG가 VARCHAR2 형태이기 때문에 위와 같은 에러가 발생하는데 CLOB 형태로 변환하게 되면 4000 자 이상의 값을 붙일 수 있다. LISTAGG를 영역별로 쪼갠 다음에 이어 붙여야 한다.

SELECT TO_CLOB(A.LIST) || TO_CLOB(B.LIST)
  FROM DUAL;

 

3. XMLAGG를 활용하여 LISTAGG 처럼 붙일 수 있다.

-- 123456789 (CLOB 타입) String 타입은 (.getStringVal())
SELECT xmlagg(xmlelement(a,'' || val) order by val).extract('//text()').getClobVal()
  FROM DEPT;

 

4. OBJECT 생성하여 대용량 문자열 붙이기 활용하기

LISTAGG와 같은 형태의 CLOB 버전의 OBJECT 만들어서 사용하는 것이다.

해당 방법은 다음 블로그에 자세한 설명이 나와 있다.

https://estenpark.tistory.com/352

반응형
그리드형