10g树形查询特性CONNECT_BY_ISCYCLE的9i实现方式一
作者: 杨廷琨, 出处:blog, 责任编辑: 王晓晨,
2008-07-25 08:00
在10g中Oracle提供了新的伪列:CONNECT_BY_ISCYCLE,通过这个伪列,可以判断是否在树形查询的过程中构成了循环,这个伪列只是在CONNECT BY NOCYCLE方式下有效。
可以看到,CONNECT_BY_ISCYCLE伪列指出循环在树形查询中发生的位置。
为了实现CONNECT_BY_ISCYCLE就必须先实现CONNECT BY NOCYCLE方式,而这在9i中是没有现成的办法的,所以这里尝试使用PL/SQL来自己实现树形查询的功能。
| SQL> CREATE OR REPLACE FUNCTION F_FIND_CHILD(P_VALUE VARCHAR2) RETURN VARCHAR2 AS 2 V_STR VARCHAR2(32767) := '/' || P_VALUE; 3 4 PROCEDURE P_GET_CHILD_STR (P_FATHER IN VARCHAR2, P_STR IN OUT VARCHAR2) AS 5 BEGIN 6 FOR I IN (SELECT ID FROM T_TREE WHERE FATHER_ID = P_FATHER AND FATHER_ID != ID) LOOP 7 IF INSTR(P_STR || '/', '/' || I.ID || '/') = 0 THEN 8 P_STR := P_STR || '/' || I.ID; 9 P_GET_CHILD_STR(I.ID, P_STR); 10 END IF; 11 END LOOP; 12 END; 13 BEGIN 14 P_GET_CHILD_STR(P_VALUE, V_STR); 15 RETURN V_STR; 16 END; 17 / |
函数已创建。
构造一个函数,在函数中递归调用过程来实现树形查询的功能。
下面看看调用这个函数的结果:
| SQL> SELECT F_FIND_CHILD(0) FROM DUAL; F_FIND_CHILD(0) ------------------------------------------------ /0/1/2/5/3/4/6/7 SQL> SELECT F_FIND_CHILD(2) FROM DUAL; F_FIND_CHILD(2) ------------------------------------------------ /2/5 SQL> SELECT F_FIND_CHILD(4) FROM DUAL; F_FIND_CHILD(4) ------------------------------------------------ /4/6/7 |
虽然目前存在的问题还有很多,但是已经基本上实现了一个最简单的NOCYCLE的SYS_CONNECT_BY_PATH的功能。
有了这个函数作为基础,就可以逐步的实现最终的目标了。
- 本文关键词:
- Oracle 10g
- 查询

