10g树形查询新特性CONNECT_BY_ISCYCLE的9i实现方式(二)
上一篇 / 下一篇 2008-07-22 23:49:14 / 个人分类:ORACLE
在
初步实现CONNECT BY NOCYCLE的功能。
有了前面一篇的基础,可以获取到类似SYS_CONNECT_BY_PATH的ID字符串,通过解析这个字符串就可以从原表中来读取对应的记录。
在前不久刚刚写过一篇文章,描述如何处理将固定字符分隔的字符串转化为表的形式:http://yangtingkun.itpub.net/post/468/455390
采用上面文章中介绍的方法,就可以将获取的字符串转化为表的形式,不过由于这里是分隔符是’/’不是’,’,因此需要将上面的过程进行一下修改:
SQL> CREATE OR REPLACE TYPE T_IN IS TABLE OF NUMBER;ITPUB个人空间2CI(W@
u6d [!|ok
2 /
类型已创建。
SQL> CREATE OR REPLACE FUNCTION F_TO_T_IN (P_IN VARCHAR2) RETURN T_IN ASITPUB个人空间RPJ&T+T;W@&F
2 V_RETURN T_IN DEFAULT T_IN();ITPUB个人空间+Cs$C#g8b7j{;Q
3 V_IN VARCHAR2(32767);
?Fm$y4`jG'X9x-Y'a0 4 V_COUNT NUMBER DEFAULT 0;ITPUB个人空间 ~s A,Wqf5n3o
5 BEGIN
5qM,@B8W"R0 6 V_IN := LTRIM(P_IN || '/', '/');ITPUB个人空间n3WV1C%x3MM
7 WHILE(INSTR(V_IN, '/') > 0) LOOP
ZC I$U,B1Q/C0 8 V_RETURN.EXTEND;
A#NjF
L&Ix0 9 V_COUNT := V_COUNT + 1;ITPUB个人空间!ZvJ@2D2P/J
10 V_RETURN(V_COUNT) := SUBSTR(V_IN, 1, INSTR(V_IN, '/') - 1);
7C.yNn+Q{0 11 V_IN := SUBSTR(V_IN, INSTR(V_IN, '/') + 1);ITPUB个人空间1h,d]X)i`;R1V`2T
12 END LOOP;
D"j:V8wjy|0 13 RETURN V_RETURN;ITPUB个人空间Q
O,j7s2ke2R Q0H
14 END;ITPUB个人空间s IJ
T!~"BbG
15 /
函数已创建。
SQL> SELECT F_TO_T_IN('/
F_TO_T_IN('/
----------------------------------------------------------------------------ITPUB个人空间;O${+d%Q&IT*Y
T_IN(0, 1, 2, 3)
SQL> SELECT * FROM TABLE(F_TO_T_IN('/
COLUMN_VALUEITPUB个人空间8L4R'O-D$y#[HpX+SfT
------------
0I4|hW5JAo0 0ITPUB个人空间xd(oU:[;SP I8Kv
1
|(PxH5i
v^0 2
r1v,W~.m)bE
\}0 3
下面只需要关联原表就可以得到相应的记录:
SQL> SELECT A.*
c
W,j5KsP0 2 FROM T_TREE A,ITPUB个人空间;^2k+r7vo+ld`
3 TABLE(F_TO_T_IN(F_FIND_CHILD(0))) B
f#Dsp`mf0 4 WHERE A.ID = B.COLUMN_VALUE;
ID FATHER_ID NAME
Q%aoH9~
G^N(U8^0---------- ---------- ------------------------------ITPUB个人空间 x"Q/@sq7y-hz
0 0 ROOTITPUB个人空间'^4m#O0Y7Ly
1
2 1 BC
[fX)F8FO0 5 2 HIJ
.|
WD[|+K$y [^s0 3 1 DE