START WITH, CONNECT BY 구문 관련 질문입니다. 0 2 11,189

by 팔오 [2013.10.11 09:11:06]



SELECT OSE.ORGANIZATION_ID_PARENT   ORG_ID,
    OSE.ORGANIZATION_ID_PARENT   ORG_ID,
   HOU.NAME
INTO  :CONTROL.BU_ID,
  :QUERY_FIND.BU_ID,
:QUERY_FIND.BU_NAME
FROM   HR_ORGANIZATION_UNITS_V HOU
,   (SELECT *
    FROM   PER_ORG_STRUCTURE_ELEMENTS   OSE
    START  WITH OSE.ORGANIZATION_ID_CHILD  = :CONTROL.DEPT_ID-- 587--L_ORG_ID
    CONNECT BY OSE.ORGANIZATION_ID_CHILD   = PRIOR OSE.ORGANIZATION_ID_PARENT) OSE
,   PA_IMPLEMENTATIONS_ALL   PIA
,   PER_ORGANIZATION_STRUCTURES POS
,   PER_ORG_STRUCTURE_VERSIONS   VER
WHERE  HOU.ORGANIZATION_ID =  OSE.ORGANIZATION_ID_PARENT
AND    OSE.ORG_STRUCTURE_VERSION_ID    =  PIA.ORG_STRUCTURE_VERSION_ID
AND    PIA.ORG_ID   =  0
AND    PIA.ORGANIZATION_STRUCTURE_ID   =  POS.ORGANIZATION_STRUCTURE_ID
AND    POS.ORGANIZATION_STRUCTURE_ID   =  VER.ORGANIZATION_STRUCTURE_ID
AND    HOU.ORGANIZATION_TYPE    = 'BU';

이러한 쿼리문을 돌렸을때
ORA-01436: CONNECT BY loop in user data
라는 에러가 발생합니다.

처리하기 위해서 찾아보니
START WITH, CONNECT BY 구문을 쓰면서 무한 루프에 빠져서 허우적대고 있다는 것이었는데,

START WITH, CONNECT BY 구문을 아직 제대로 몰라서 인터넷으로 찾아 보고 공부 하고 있으나 잘 이해가 안되네요...
CONNECT BY 뒤에 NOCYCLE을 적어주니 해결이 되긴하던데
이건 임시 방편이고 Form 파일을 컴파일 시켜주니 에러가 발생합니다.

이 쿼리문을 어떻게 고쳐야 해결할 수 있을까요?
아니면 해결해 나가야 하는 방법을 좀 알려주세요~ㅠㅠ
by 마농 [2013.10.11 10:14:16]
두가지 가능성이 있습니다.
1. 데이터엔 문제가 없는데 쿼리에 문제가 있는 경우
  - CONNECT BY 절에 조인 조건이 누락된 경우입니다.
  - 쿼리를 보아하니 버전관리가 되는 듯한데요. 버전 조건이 누락된 듯.
2. 쿼리엔 문제가 없는데 데이터에 문제가 있는 경우
  - 순환되는 자료(예:1-2-3-1)를 찾아 고치셔야 합니다.
  - NoCycle 옵션을 준 상태에서 다음 조건절을 추가해 보세요.
  - WHERE CONNECT_BY_ISCYCLE = 1

by 팔오 [2013.10.14 13:16:35]

답변 감사합니다.

어떤 이유인지 알게 되었고, 잘 해결했습니다~

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