posted by 지긋이 2020. 2. 14. 15:51

DB에서 제일 어려운 게 계층형 구조이다. 몇 년이 지나도 아직도 넘나 어려운 것...

오늘도 위기의 오류는 ORA-01436: CONNECT BY의 루프가 발생되었습니다.

이 문제는 오류문구에 답이 있는데 루프를 도는데 문제가 발생했다는 것으로
1) 데이터엔 문제가 없는데 쿼리에 문제가 있다.
: Connect by 절에 조인 조건 누락
2) 쿼리엔 문제가 없는데 데이터에 문제가 있다. 
: 순환되는 자료 오류

2)의 케이스인 경우 간단한 해결 방법으로는 Connect By 뒤에 NOCYCLE을 추가하는 것이다.
말 뜻 그대로 루프 사이클을 돌리지 않겠다는 건데...

제대로 고치려면 1) 쿼리 자체의 수정 혹은 2)Data의 수정이 필요하다.

특히나, 오류가 발생되는 지점을 확인하기 위해서는 CONNECT_BY_ISCYCLE을
조회하는 컬럼에 추가하여 오류 지점이면 1, 아니면 0으로 구분할 수 있으며,
WHERE CONNECT_BY_ISCYCLE = 1을 추가하여 찾아 고쳐보도록 한다.

Ex)
Select LEVEL AS _Lev
        ,Col1
        ,Col2
        ,Col3
        ,Col4
        ,CONNECT_BY_ISCYCLE
FROM (
          Select A.ColSub1
                  ,A.ColSub2
                  ,A.ColSub3
                  ,A.ColSub4
           From Ttest1 A, Ttest2 B
           Where A.ColSub1 = B.ColSub1
            ...
           Group By ColSub1, ColSub2, ColSub3, ColSub4
           ) A
Start With A.Col1 IS NULL
Connet By NOCYCLE PRIOR A.Col2 = A.Col3 --Join 조건

필자의 경우 A.Col2 = A.Col3 데이터가 동일하여 계층 구조를 만드는데 오류가 발생되었음

주저리주저리... 부모를 의미하는 Col3와 Col2 데이터가 동일 = 자기자신을 가르킨 형태..
운영 데이터랑 테스트 데이터가 일치하지 않는데다가 오류 메시지도 데이터 세팅 모두 끝낸 상태에서 쿼리를 조회하니 그때서야 오류가 나와서 하아...

참고
구루비 : http://www.gurubee.net/article/60617 오류 케이스 찾는 방법 설명

계층쿼리 실행 순서
Start With => Connect By => Where