4000byte이상 넘어가는 컬럼을 clob를 사용해서 변환하고자 합니다. 0 1 3,333

by 나이많은초보 [SQL Query] [2021.02.24 17:21:42]


안녕하세요 왕초보라 늘 질문이 많습니다.

고수님들의 도움 부탁 드리겠습니다.

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'))

 

어떻게 처리해야할지 막막해서요 ㅠㅠ

도움 부탁드리고자 합니다. ㅠ

by 마농 [2021.02.24 18:08:57]

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')
                   )
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입