안녕하세요 왕초보라 늘 질문이 많습니다.
고수님들의 도움 부탁 드리겠습니다.
LISTAGG(A.ABONO,', ') WITHIN GROUP (ORDER BY A.ABONO) -> 이컬럼이 현재 VARCHAR2로 설정했는데, 4000BYTE가 넘어가는 경우가 있어서.. CLOB로 변경해서 사용하라고 하네요..
SELECT COUNT(A.ABONO) AS CNT,
CASE WHEN COUNT(A.ABONO) > 0 THEN
LISTAGG(A.ABONO,', ') WITHIN GROUP (ORDER BY A.ABONO)
END AS ABONO
FROM TB_AST_MAIN A INNER JOIN TB_AST_MANAGE B
ON A.ABONO = B.ABONO
INNER JOIN TB_EMPLOYEE C ON B.EUSER = C.PAYNO
WHERE (A.STAT = '01' OR A.STAT = 'Y')
AND B.ABONO in (SELECT C.ABONO AS ABONO FROM TB_AST_CHANGE_OVER_MASTER A LEFT OUTER JOIN TB_AST_CHANGE_OVER_DETAIL C ON A.CONO = C.CONO WHERE STAT NOT IN ('005','006'))
어떻게 처리해야할지 막막해서요 ㅠㅠ
도움 부탁드리고자 합니다. ㅠ
1. 불필요하게 작성된 부분들이 있네요.
- COUNT(a.abono) 는 굳이 컬럼을 카운트할 필요가 없고 --> COUNT(*)
- CASE 구문도 불필요하게 사용되었네요.
2. 4000 Byte 이상 오류는.
- XMLAgg 의 getCLOBval() 을 이용해 보세요.
- http://gurubee.net/article/55512
3. 혹시 오류 발생 이유가 다른데 있는 건 아닌지?
- 잘못된 조인 등으로 인한 중복 자료 다수 발생 등의 이유.
SELECT COUNT(*) cnt -- , LISTAGG(a.abono, ', ') WITHIN GROUP (ORDER BY a.abono) abono , SUBSTR( XMLAgg(XMLElement(x, ', ', a.abono) ORDER BY a.abono).Extract('//text()').getCLOBval() , 3) abono FROM tb_ast_main a INNER JOIN tb_ast_manage b ON a.abono = b.abono INNER JOIN tb_employee c ON b.euser = c.payno WHERE (a.stat = '01' or a.stat = 'Y') AND b.abono IN (SELECT c.abono AS abono FROM tb_ast_change_over_master a LEFT OUTER JOIN tb_ast_change_over_detail c ON a.cono = c.cono WHERE stat NOT IN ('005','006') ) ;