错误码:-4030
错误内容:用户数据中的CONNECT BY循环
层次查询是处理具有层次结构数据(如组织结构图、树形结构等)的查询技术。它允许用户从根节点开始,逐级向下遍历树或图结构,获取每个节点及其子节点的信息,当关系条件中父节点和子节点出现循环遍历。
create table test1(sid number,name varchar2(10),pid number);
insert into TEST1 values (1, 'A', 1); --问题数据
insert into TEST1 values (2, 'B', 1);
insert into TEST1 values (3, 'C', 2);
insert into TEST1 values (4, 'D', 2);
insert into TEST1 values (5, 'E', 3);
insert into TEST1 values (2, 'F', 5); --问题数据
commit;
情况1:
--以sid为逻辑表达式中的父节点,自顶到底,检索sid=2为起始根节点的所有子节点(2->3,4->5),但存在问题数据(2,'F',5)导致pid=5需要再次遍历sid=2产生循环。
select * from test1 start with sid=2 connect by prior sid=pid;
执行失败(语句1)
-4030: 用户数据中的CONNECT BY循环
情况2:
--以pid为逻辑表达式中的父节点,自底到顶,检索sid=5为起始根节点的所有子节点(5->3->2->1),但存在问题数据(1,'A',1)导致sid=1需要再次遍历pid=1产生循环。
select * from test1 start with sid=5 connect by prior pid=sid;
执行失败(语句1)
-4030: 用户数据中的CONNECT BY循环
1、处理问题数据
情况1:
update test1 set pid=null where name='A';
commit;
情况2:
update test1 set sid=6 where name='F';
commit;
2、通过关键字nocycle避免出现循环遍历
情况1:正确结果如下
select * from test1 start with sid=2 connect by nocycle prior sid=pid;
SID NAME PID
--- ---- ---
2 B 1
4 D 2
3 C 2
5 E 3
6 F 5
情况2:正确结果如下
select * from test1 start with sid=5 connect by nocycle prior pid=sid;
SID NAME PID
--- ---- ----
5 E 3
3 C 2
2 B 1
1 A NULL
文章
阅读量
获赞