10g树形查询特性CONNECT_BY_ISCYCLE的9i实现方式二
作者: 杨廷琨, 出处:blog, 责任编辑: 王晓晨,
2008-07-25 00:00
采用将固定字符分隔的字符串转化为表的形式的方法,就可以将获取的字符串转化为表的形式。
10g树形查询新特性CONNECT_BY_ISCYCLE的9i实现方式一
10g树形查询新特性CONNECT_BY_ISCYCLE的9i实现方式二
10g树形查询新特性CONNECT_BY_ISCYCLE的9i实现方式三
有了前面一篇的基础,可以获取到类似SYS_CONNECT_BY_PATH的ID字符串,通过解析这个字符串就可以从原表中来读取对应的记录。
采用TYPE解决IN列表过长的方法,就可以将获取的字符串转化为表的形式,不过由于这里是分隔符是’/’不是’,’,因此需要将下面的过程进行一下修改:
| SQL> CREATE OR REPLACE TYPE T_IN IS TABLE OF NUMBER; 2 / 类型已创建。 SQL> CREATE OR REPLACE FUNCTION F_TO_T_IN (P_IN VARCHAR2) RETURN T_IN AS 2 V_RETURN T_IN DEFAULT T_IN(); 3 V_IN VARCHAR2(32767); 4 V_COUNT NUMBER DEFAULT 0; 5 BEGIN 6 V_IN := LTRIM(P_IN || '/', '/'); 7 WHILE(INSTR(V_IN, '/') > 0) LOOP 8 V_RETURN.EXTEND; 9 V_COUNT := V_COUNT + 1; 10 V_RETURN(V_COUNT) := SUBSTR(V_IN, 1, INSTR(V_IN, '/') - 1); 11 V_IN := SUBSTR(V_IN, INSTR(V_IN, '/') + 1); 12 END LOOP; 13 RETURN V_RETURN; 14 END; 15 / 函数已创建。 SQL> SELECT F_TO_T_IN('/0/1/2/3') FROM DUAL; F_TO_T_IN('/0/1/2/3') ---------------------------------------------------------------------------- T_IN(0, 1, 2, 3) SQL> SELECT * FROM TABLE(F_TO_T_IN('/0/1/2/3')); COLUMN_VALUE ------------ 0 1 2 3 |
下面只需要关联原表就可以得到相应的记录:
| SQL> SELECT A.* 2 FROM T_TREE A, 3 TABLE(F_TO_T_IN(F_FIND_CHILD(0))) B 4 WHERE A.ID = B.COLUMN_VALUE; ID FATHER_ID NAME ---------- ---------- ------------------------------ 0 0 ROOT 1 0 A 2 1 BC 5 2 HIJ 3 1 DE 4 7 FG 4 1 FG 6 4 KLM 7 6 NOPQ 已选择9行。 |
现在就自己实现了非循环方式CONNECT BY的记录,不过和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行。 |
- 本文关键词:
- Oracle 10g
- 查询

