在10g中Oracle提供了新的伪列:CONNECT_BY_ISCYCLE,通过这个伪列,可以判断是否在树形查询的过程中构成了循环,这个伪列只是在CONNECT BY NOCYCLE方式下有效。 这一篇描述一下解决问题的思路。& o/ T; B" C1 t& p" T+ M5 V5 l4 A
CONNECT_BY_ISCYCLE的实现和前面两篇文章中CONNECT_BY_ROOT和CONNECT_BY_ISLEAF的实现完全不同。1 a y* [" N* S/ W% r% H* U
因为要实现CONNECT_BY_ISCYCLE,就必须先实现CONNECT BY NOCYCLE,而在9i中是没有方法实现这个功能的。! W$ [0 G/ j- L
也就是说,首先要实现自己的树形查询的功能,而仅这第一点,就是一个异常困难的问题,何况后面还要实现NOCYCLE,最后再加上一个ISCYCLE的判断。0 m. Q0 E0 e! ?9 y8 k# p; r2 `1 a
所以总的来说,这个功能的实现比前面两个功能要复杂得多。由于树形查询的LEVEL是不固定的,所以采用链接的方式实现,基本上是不现实的。换句话说,用纯SQL的方式来实现树形查询的功能基本上不可行。而为了解决这个功能,只能通过PL/SQL配合SQL来实现。
+ u# }+ R* y K 仍然是首先构造一个例子:8 F+ W/ _9 j& q, H1 N
SQL> CREATE TABLE T_TREE (ID NUMBER, FATHER_ID NUMBER, NAME VARCHAR2(30));0 A" n I3 ?. L
表已创建。% a0 ? `5 Y7 f" H) G4 q! k
SQL> INSERT INTO T_TREE VALUES (1, 0, 'A');
. Y i$ z' N9 w5 h0 _. \ 已创建 1 行。
8 z) D7 R' c8 d3 Z/ t SQL> INSERT INTO T_TREE VALUES (2, 1, 'BC');: y, j. _7 U3 t
已创建 1 行。: A% r5 X% `4 L* s5 Z6 d6 E' o( \
SQL> INSERT INTO T_TREE VALUES (3, 1, 'DE');9 Y- r# L/ ?# A4 @
已创建 1 行。
6 p O/ @$ R* p4 T- N& E+ E SQL> INSERT INTO T_TREE VALUES (4, 1, 'FG');# D; {! N; o+ B& t7 R, k
已创建 1 行。$ M% B% A T; g% A
SQL> INSERT INTO T_TREE VALUES (5, 2, 'HIJ');4 I+ m, ]' Q( ?$ L1 I$ B
已创建 1 行。2 x9 Z& @* V5 D7 u
SQL> INSERT INTO T_TREE VALUES (6, 4, 'KLM');
6 T0 Q1 k; n6 c: u; m \ 已创建 1 行。& P) `" g* z" Z) b# ^
SQL> INSERT INTO T_TREE VALUES (7, 6, 'NOPQ');
( M3 e5 Z' ^+ ~0 s. n, L& E 已创建 1 行。+ i4 q% ~# v9 d$ ?& |) i' N4 D- [' y
SQL> INSERT INTO T_TREE VALUES (0, 0, 'ROOT');) w! b/ y, z6 L6 G- }6 H2 S4 G
已创建 1 行。, [5 u- `5 l1 p& R
SQL> INSERT INTO T_TREE VALUES (4, 7, 'FG');
7 o( S% S$ w; s+ q 已创建 1 行。' L! B4 G* P8 Q6 S
SQL> COMMIT;
4 o2 T1 g4 ^; V( B 提交完成。
. @, ~6 p5 X! V) q SQL> SELECT * FROM T_TREE;
$ y0 ^/ L7 u. [* U ID FATHER_ID NAME
+ }: n; _6 Y' C ---------- ---------- ------------------------------4 G: C$ x$ m9 w! c5 Z
1 0 A
1 @; Q7 b* B4 c. \1 L$ u 2 1 BC
2 M% `" c5 D2 ^/ O( _$ @) z 3 1 DE
! P2 D w2 Y% ?4 G( p8 n! u 4 1 FG
8 p7 G9 u( `4 k( U 5 2 HIJ
* O3 O3 u$ ?% F# O 6 4 KLM; ]: o! e4 g# }5 f$ o3 N
7 6 NOPQ2 Z7 b L1 |8 b1 H1 [% a; Y1 I% F$ _
0 0 ROOT
- F" j0 {. D: F/ @! z- v2 X 4 7 FG
& n& S& {* J. Z8 w' ^
$ x9 Q* m' x' G8 i {" W 已选择9行。 |