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 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的功能。

  有了这个函数作为基础,就可以逐步的实现最终的目标了。

共3页。 9 1 2 3

网友评论

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

邮件订阅


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