반응형
쿼리에서 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 만들어서 사용하는 것이다.
해당 방법은 다음 블로그에 자세한 설명이 나와 있다.
반응형
'개발자의 시선 > 개발자' 카테고리의 다른 글
[Toast UI Grid] Model에서 조회시 데이터 안보이는 경우 (0) | 2022.11.09 |
---|---|
[이클립스] 제공받은 WSDL로 소스 임포트하기 (0) | 2020.12.12 |
[fanatical] 프로그래밍(C++,JAVA,PYTHON) 번들 무료 배포 (영어) (0) | 2020.09.16 |
온라인 IDE 리플릿 소개 (repl.it) (0) | 2020.08.23 |
[ORACLE] ORA-01555 너무 이전 스냅샷 : 롤백 세그먼트 (0) | 2020.03.22 |
[ORACLE] ORA-01002 인출 시퀀스가 틀립니다. (0) | 2019.06.22 |
JAVA 인증서 파일 추가 (JAVA certification import) (0) | 2019.05.16 |
알고리즘 문제 및 풀이 사이트 소개 (leetcode) (0) | 2019.02.16 |