2011年1月27日 星期四

ORA-01436: CONNECT BY loop in user data, How to Find Cycle Record

DESC BOM
Name Null Type
---- -------- ------------
P NOT NULL VARCHAR2(20)
C NOT NULL VARCHAR2(20)

--NO CYCLE DATA
SELECT * FROM BOM
ORDER BY P;

A B
B C
C D

--NO CYCLE DATA + SELECT
SELECT LEVEL,P,C, SYS_CONNECT_BY_PATH(P,'\')
FROM BOM
START WITH P ='A' CONNECT BY PRIOR C = P;

1 A B \A
2 B C \A\B
3 C D \A\B\C

--LOOP DATA
SELECT * FROM BOM
ORDER BY P;

A B
B C
C D
D A

--CYCLE DATA + SELECT = ORA-01436: CONNECT BY loop in user data
SELECT LEVEL,P,C, SYS_CONNECT_BY_PATH(P,'\')
FROM BOM
START WITH P ='A' CONNECT BY PRIOR C = P;

ORA-01436: CONNECT BY loop in user data
01436. 00000 - "CONNECT BY loop in user data"
*Cause:
*Action:

--CYCLE DATA + SELECT(NOCYCLE)
SELECT LEVEL,P,C, SYS_CONNECT_BY_PATH(P,'\')
FROM BOM
START WITH P ='A' CONNECT BY NOCYCLE PRIOR C = P;

1 A B \A
2 B C \A\B
3 C D \A\B\C
4 D A \A\B\C\D

--CYCLE DATA + SELECT(CONNECT_BY_ISCYCLE,NOCYCLE) = GET CYCLE RECORD(MAYBE)
SELECT LEVEL,CONNECT_BY_ISCYCLE,P,C, SYS_CONNECT_BY_PATH(P,'\')
FROM BOM
START WITH P ='A' CONNECT BY NOCYCLE PRIOR C = P;

1 0 A B \A
2 0 B C \A\B
3 0 C D \A\B\C
4 1 D A \A\B\C\D <-- CYCLE RECORD(MAYBE)

沒有留言: