知识大全 10g树形查询新特性

Posted

篇首语:不怕百事不利,就怕灰心丧气。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 10g树形查询新特性相关的知识,希望对你有一定的参考价值。

  在 g中Oracle提供了新的伪列 CONNECT_BY_ISCYCLE 通过这个伪列 可以判断是否在树形查询的过程中构成了循环 这个伪列只是在CONNECT BY NOCYCLE方式下有效

  这一篇描述一下解决问题的思路

  CONNECT_BY_ISCYCLE的实现和前面两篇文章中CONNECT_BY_ROOT和CONNECT_BY_ISLEAF的实现完全不同

  因为要实现CONNECT_BY_ISCYCLE 就必须先实现CONNECT BY NOCYCLE 而在 i中是没有方法实现这个功能的

  也就是说 首先要实现自己的树形查询的功能 而仅这第一点 就是一个异常困难的问题 何况后面还要实现NOCYCLE 最后再加上一个ISCYCLE的判断

  所以总的来说 这个功能的实现比前面两个功能要复杂得多 由于树形查询的LEVEL是不固定的 所以采用链接的方式实现 基本上是不现实的 换句话说 用纯SQL的方式来实现树形查询的功能基本上不可行 而为了解决这个功能 只能通过PL/SQL配合SQL来实现

  仍然是首先构造一个例子

  SQL> CREATE TABLE T_TREE (ID NUMBER FATHER_ID NUMBER NAME VARCHAR ( ));

  表已创建

  SQL> INSERT INTO T_TREE VALUES ( A );

  已创建 行

  SQL> INSERT INTO T_TREE VALUES ( BC );

  已创建 行

  SQL> INSERT INTO T_TREE VALUES ( DE );

  已创建 行

  SQL> INSERT INTO T_TREE VALUES ( FG );

  已创建 行

  SQL> INSERT INTO T_TREE VALUES ( HIJ );

  已创建 行

  SQL> INSERT INTO T_TREE VALUES ( KLM );

  已创建 行

  SQL> INSERT INTO T_TREE VALUES ( NOPQ );

  已创建 行

  SQL> INSERT INTO T_TREE VALUES ( ROOT );

  已创建 行

  SQL> INSERT INTO T_TREE VALUES ( FG );

  已创建 行

  SQL> MIT;

  提交完成

  SQL> SELECT * FROM T_TREE;

  ID FATHER_ID NAME

  

   A

   BC

   DE

   FG

   HIJ

   KLM

   NOPQ

   ROOT

   FG

  已选择 行

  上面构造了两种树形查询循环的情况 一种是当前记录的自循环 另一种是树形查询的某个子节点是当前节点的祖先节点 从而构成了循环 在这个例子中 记录ID为 和ID为 且FATHER_ID等于 的两条记录分别构成了上述的两种循环的情况

  下面就来看看CONNECT_BY_ISCYCLE和CONNECT BY NOCYCLE的功能

  SQL> SELECT *

   FROM T_TREE

   START WITH ID =

   CONNECT BY PRIOR ID = FATHER_ID;

  ERROR:

  ORA : 用户数据中的 CONNECT BY 循环

  未选定行

  SQL> SELECT *

   FROM T_TREE

   START WITH ID =

   CONNECT BY PRIOR ID = FATHER_ID;

  ERROR:

  ORA : 用户数据中的 CONNECT BY 循环

  未选定行

  这就是不使用CONNECT BY NOCYCLE的情况 查询会报错 指出树形查询中出现循环 在 g中可以使用CONNECT BY NOCYCLE的方式来避免错误的产生

  SQL> SELECT *

   FROM T_TREE

   START WITH ID =

   CONNECT BY NOCYCLE PRIOR ID = FATHER_ID;

  ID FATHER_ID NAME

  

   ROOT

   A

   BC

   HIJ

   DE

   FG

   KLM

   NOPQ

  已选择 行

  使用CONNECT BY NOCYCLE Oracle自动避免循环的产生 将不产生循环的数据查询出来 下面看看CONNECT_BY_ISCYCLE的功能

  SQL> SELECT ID

   FATHER_ID

   NAME

   CONNECT_BY_ISCYCLE CYCLED

   FROM T_TREE

   START WITH ID =

   CONNECT BY NOCYCLE PRIOR ID = FATHER_ID;

  ID FATHER_ID NAME CYCLED

  

   ROOT

   A

   BC

   HIJ

   DE

   FG

   KLM

   NOPQ

  已选择 行

  可以看到 CONNECT_BY_ISCYCLE伪列指出循环在树形查询中发生的位置

  为了实现CONNECT_BY_ISCYCLE就必须先实现CONNECT BY NOCYCLE方式 而这在 i中是没有现成的办法的 所以这里尝试使用PL/SQL来自己实现树形查询的功能

  SQL> CREATE OR REPLACE FUNCTION F_FIND_CHILD(P_VALUE VARCHAR ) RETURN VARCHAR AS

   V_STR VARCHAR ( ) := / || P_VALUE;

  

   PROCEDURE P_GET_CHILD_STR (P_FATHER IN VARCHAR P_STR IN OUT VARCHAR ) AS

   BEGIN

   FOR I IN (SELECT ID FROM T_TREE WHERE FATHER_ID = P_FATHER AND FATHER_ID != ID) LOOP

   IF INSTR(P_STR || / / || I ID || / ) = THEN

   P_STR := P_STR || / || I ID;

   P_GET_CHILD_STR(I ID P_STR);

   END IF;

   END LOOP;

   END;

   BEGIN

   P_GET_CHILD_STR(P_VALUE V_STR);

   RETURN V_STR;

   END;

   /

  函数已创建

  构造一个函数 在函数中递归调用过程来实现树形查询的功能

  下面看看调用这个函数的结果

  SQL> SELECT F_FIND_CHILD( ) FROM DUAL;

  F_FIND_CHILD( )

  

  / / / / / / / /

  SQL> SELECT F_FIND_CHILD( ) FROM DUAL;

  F_FIND_CHILD( )

  

  / /

  SQL> SELECT F_FIND_CHILD( ) FROM DUAL;

  F_FIND_CHILD( )

  

  / / /

  虽然目前存在的问题还有很多 但是已经基本上实现了一个最简单的NOCYCLE的SYS_CONNECT_BY_PATH的功能

cha138/Article/program/Oracle/201311/16670

相关参考

知识大全 Oracle10g新特性—RMAN

Oracle10g新特性—RMAN  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  RMAN增量备

知识大全 Oracle10g最佳20个新特性

Oracle10g最佳20个新特性  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!答案依DBA的工作

知识大全 oracle 10g 新特性中文笔记一

  第一章安装    目标    完成本课您将能够:    *列出新的安装特性  *列出安装性能的增加    安装新特性支持    *数据库存储选项  文件系统  自动存储管理(asm)  裸设备  

知识大全 Oracle10g新特性——选择性编译

Oracle10g新特性——选择性编译  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Oracl

知识大全 Oracle10g新特性—选择性编译

Oracle10g新特性—选择性编译  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Oracle

知识大全 Oracle10g新特性—增强的CONNECTBY子句

Oracle10g新特性—增强的CONNECTBY子句  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧

知识大全 使用Oracle10g提供的flashback drop新特性

使用Oracle10g提供的flashbackdrop新特性  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看

知识大全 oracle树形结构实行查询

  ORACLE提供了一种树形结构用来实现层次查询  STARTWITH指定查询的根行  CONNECTBY指定父行和子行的关系  PRIOR引用父行  为测试方便使用如下Demo  建立数据库表Tr

知识大全 在Oracle10g和9i上一些新的特性的总结

在Oracle10g和9i上一些新的特性的总结  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!内部P

知识大全 简单查询树形结构数据库表

  在与同事讨论中得到一个思路不用嵌套调用直接用一个语句就可以生成树实事上他已经做好了该程序他用了临时表写了一个存储过程我改写为一个表值函数供大家参考  表结构及表值函数如下  查询树表语句    /