CTOCIO IT专家网

天极传媒 比特网 | 天极网 | IT专家网 | IT商网 | 52PK游戏网 | 手机天极 | IT分众 |
IT专家网搜索

数据库 | Oracle | DB2 | SQL Server | MySQL | 商业智能 | BI | DBA | Sybase| SQL Server 2008

您现在的位置: IT专家网 > 数据库子站 > 数据库技巧

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行。
共3页。 1 2 3 :

网友评论

笔名 
请您注意:遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。    IT专家网友拥有管理笔名和留言的一切权利。
  • 周排行榜
  • 月排行榜

邮件订阅


    
天极服务 | 关于我们 | 网站律师 | 加入我们 | 联系我们 | 广告业务 | 友情链接 | 我要挑错
All Rights Reserved, Copyright 2004-2008, Ctocio.com.cn
渝ICP证B2-20030003号 如有意见请与我们联系 powered by 天极内容管理平台CMS4i