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行。
posted @ 2011-05-11 11:40  ﹎"該變ゾ  阅读(526)  评论(0)    收藏  举报