Oracle 10G - 增强的CONNECT BY子句

那些事不想说

那些事不想说

2016-02-19 15:43

岁数大了,QQ也不闪了,微信也不响了,电话也不来了,但是图老师依旧坚持为大家推荐最精彩的内容,下面为大家精心准备的Oracle 10G - 增强的CONNECT BY子句,希望大家看完后能赶快学习起来。

为 了更好的查询一个树状结构的表,在Oracle的PL/SQL中提供乐一个诱人的特性——CONNECT BY子句。它大大的方便了我们查找树状表:遍历一棵树、寻找某个分支......,但还是存在一些不足。在Oracle 10G,就对这个特性做了增强。下面就举例说明一下。

CONNECT_BY_ISCYCLE

树状一般都是在一条记录中记录一个当前节点的ID和这个节点的父ID来实现。但是,一旦数据中出现了循环记录,如两个节点互为对方父节点,系统就会报ORA-01436错误,例如:

如果有这样的数据

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

insert into t_tonedirlib(dirindex, fatherindex, dirname, status) values (666, 667, '123', 5);insert into t_tonedirlib(dirindex, fatherindex, dirname, status) values (667, 666, '456', 5);

执行这样的查询

select dirindex, fatherindex, RPAD(' ', 2*(LEVEL-1)) || dirname from t_tonedirlibstart with fatherindex = 666connect by   fatherindex =   prior dirindex;

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

结果是 ORA-01436: 用户数据中的 CONNECT BY 循环。

10G中,可以通过加上NOCYCLE关键字避免报错。并且通过CONNECT_BY_ISCYCLE属性就知道哪些节点产生了循环
select CONNECT_BY_ISCYCLE, dirindex, fatherindex, RPAD(' ', 2*(LEVEL-1)) || dirnamefrom t_tonedirlibstart with fatherindex = 666connect by NOCYCLE fatherindex =   prior dirindexCONNECT_BY_ISCYCLE DIRINDEX FATHERINDEX RPAD(' ',2*(LEVEL-1))||dirname;----------------- ---------------- ---------------------------------                  0                    667                    666 456                  1                    666                    667 1232 rows selected
CONNECT_BY_ISLEAF
查找树状表中的叶子节点不是件容易事。可以给表增加了一个字段来描述这个节点是否为叶子节点来解决问题,但这样做有很大的弊端:需要通代码逻辑来保证这个字段的正确性。
Oracle 10G中提供了一个新特性 CONNECT_BY_ISLEAF 来解决这个问题。简单点说,这个属性结果表明当前节点在满足条件的查询结果中是否为叶子节点, 0不是,1是。

select CONNECT_BY_ISLEAF, dirindex, fatherindex, RPAD(' ', 2*(LEVEL-1)) || dirname   from t_tonedirlibstart with fatherindex = 0connect by   fatherindex =   prior dirindexCONNECT_BY_ISLEAF DIRINDEX FATHERINDEX RPAD(' ',2*(LEVEL-1))||dirname
查询结果清晰明了!
----------------- ---------------- ---------------------------------                 0                      1                      0 中文经典                            0                     52                      1    kkkkkkk                           1                     70                     52      222                             1                     58                     52      sixx                            1                     59                     52      seven                           1                     69                     52      uiouoooo                        1                     55                     52      four                            1                      7                      1    流行风云                          0                      8                      1    影视金曲                          1                   1111                      8      aaa                             1                   1112                      8      bbb                             1                   1113                      8      ccc                             1                      9                      1    古典音乐                          0                     81                      1    小熊之家                          1                    104                     81      龙珠                            1                    105                     81      snoppy                          1                    101                     81      叮当1                           1                    102                     81      龙猫                            1                    103                     81      叮当2                           0                      2                      0 热门流行                            1                     31                      2    有奖活动                          1                     32                      2    相约香格里拉                      1                     50                      2    新浪彩铃                          0                      3                      0 老歌回放                            1                    333                      3    老电影                            1                    335                      3    怀旧金曲

展开更多 50%)
分享

猜你喜欢

Oracle 10G - 增强的CONNECT BY子句

编程语言 网络编程
Oracle 10G - 增强的CONNECT BY子句

不要忽视Oracle 10g STATSPACK

编程语言 网络编程
不要忽视Oracle 10g STATSPACK

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

ORACLE 10g 安装教程[图文]

编程语言 网络编程
ORACLE 10g 安装教程[图文]

Oracle 10G 中的“回收站”

编程语言 网络编程
Oracle 10G 中的“回收站”

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

oracle 10g常见问题精选 (2)

编程语言 网络编程
oracle 10g常见问题精选 (2)

oracle 10g常见问题精选(1)

编程语言 网络编程
oracle 10g常见问题精选(1)

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

如何让windows 7下"用户文件夹"设在非系统盘

如何让windows 7下"用户文件夹"设在非系统盘

Linux Shell文本处理命令汇总

Linux Shell文本处理命令汇总
下拉加载更多内容 ↓