10g树形查询特性CONNECT_BY_ISCYCLE的9i实现方式
  在10g中Oracle提供了新的伪列:CONNECT_BY_ISCYCLE,通过这个伪列,可以判断是否在树形查询的过程中构成了循环,这个伪列只是在CONNECT 
BY NOCYCLE方式下有效。 
上面构造了两种树形查询循环的情况,一种是当前记录的自循环,另一种是树形查询的某个子节点是当前节点的祖先节点,从而构成了循环。在这个例子中,记录ID为0和ID为4且FATHER_ID等于7的两条记录分别构成了上述的两种循环的情况。
下面就来看看CONNECT_BY_ISCYCLE和CONNECT BY NOCYCLE的功能:
| SQL> SELECT * 2 FROM T_TREE 3 START WITH ID = 0 4 CONNECT BY PRIOR ID = FATHER_ID; ERROR: ORA-01436: 用户数据中的 CONNECT BY 循环 未选定行 SQL> SELECT * 2 FROM T_TREE 3 START WITH ID = 1 4 CONNECT BY PRIOR ID = FATHER_ID; ERROR: ORA-01436: 用户数据中的 CONNECT BY 循环 未选定行 | 
这就是不使用CONNECT BY NOCYCLE的情况,查询会报错,指出树形查询中出现循环,在10g中可以使用CONNECT BY NOCYCLE的方式来避免错误的产生:
| SQL> SELECT * 2 FROM T_TREE 3 START WITH ID = 0 4 CONNECT BY NOCYCLE PRIOR ID = FATHER_ID; ID FATHER_ID NAME ---------- ---------- ------------------------------ 0 0 ROOT 1 0 A 2 1 BC 5 2 HIJ 3 1 DE 4 1 FG 6 4 KLM 7 6 NOPQ 已选择8行。 | 
使用CONNECT BY NOCYCLE,Oracle自动避免循环的产生,将不产生循环的数据查询出来,下面看看CONNECT_BY_ISCYCLE的功能:
| SQL> SELECT ID, 2 FATHER_ID, 3 NAME, 4 CONNECT_BY_ISCYCLE CYCLED 5 FROM T_TREE 6 START WITH ID = 0 7 CONNECT BY NOCYCLE PRIOR ID = FATHER_ID; ID FATHER_ID NAME CYCLED ---------- ---------- ------------------------------ ---------- 0 0 ROOT 1 1 0 A 0 2 1 BC 0 5 2 HIJ 0 3 1 DE 0 4 1 FG 0 6 4 KLM 0 7 6 NOPQ 1 已选择8行。 | 
 
                    
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号