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
'IT(job) > DB' 카테고리의 다른 글
[Oracle] Select, Update, Delete, Alter, Create, Drop... (0) | 2020.02.27 |
---|---|
Oracle(Tool)에서 & 입력/조회하기 (0) | 2020.02.18 |
[Oracle] 자주 쓰는 문자/날짜 치환, 문자 위치 찾기, 자르기 등 (0) | 2019.12.12 |
[Oracle] For문 Loop 입력하기 (0) | 2019.12.02 |
[Oracle] Table Copy 기존 테이블을 이용한 응용 (0) | 2019.11.26 |