我在plsql中有一个这样的表
PK_ID DEPT_ID SUB_DEPT_ID
1 1 3
2 1 4
3 1 5
4 3 6
5 3 7
6 6 9
..............
我必须执行某个过程,直到找到某个DEPT_ID的子代,假设我取1个DEPT_ID,然后该过程应执行3、4、5,然后如果存在3个子代,则首先应对3执行(这里6,7,它将再次对6的子代执行,即9,依此类推),然后对4的子代执行(如果4的子代存在)(此处不存在),然后对5的子代(此处不存在)执行,等等继续,也许我需要为此准备某种递归函数,但对如何实现这一点了解不多,请帮忙吗?
答案 0 :(得分:0)
在这里分层查询可能效果很好。
尝试在“ for..loop”中使用如下所示的查询:
select dept_id, sub_dept_id, level
from dept_subdept
START WITH dept_id = 1
connect by prior sub_dept_id=dept_id
order by level,sub_dept_id;
例如...
GIVEN:表DEPT_SUBDEPT包含以下数据:
PK_ID DEPT_ID SUB_DEPT_ID
----- ------- -----------
1 1 3
2 1 4
3 1 5
4 3 6
5 3 7
6 6 9
7 2 8
8 2 10
9 2 1
9 rows selected.
下面显示的PLSQL通过原始问题声明中描述的部门(由DEPT_ID标识)和子或子部门(由SUB_DEPT_ID标识)工作:
“ ......取1 DEPT_ID,然后过程应执行3,4,5,然后如果存在3的子代,则首先应执行3(这里是6,7,再次将其执行以6的子代执行)是9,依此类推),如果4的子代存在(此处不存在),则对于4,然后对于5的子代(此处不存在),依此类推...”
set serveroutput on;
begin
for i in (
select dept_id, sub_dept_id,level from dept_subdept
START WITH dept_id = &START_WITH_DEPT_ID
connect by prior sub_dept_id=dept_id
order by level, sub_dept_id
) loop
dbms_output.put_line('exec someProcedure('||i.dept_id||','||i.sub_dept_id||');');
end loop;
end;
/
Enter value for start_with_dept_id: 1
exec someProcedure(1,3);
exec someProcedure(1,4);
exec someProcedure(1,5);
exec someProcedure(3,6);
exec someProcedure(3,7);
exec someProcedure(6,9);
PL/SQL procedure successfully completed.
此处使用START_WITH_DEPT_ID = 3再次运行PLSQL。
SQL> /
Enter value for start_with_dept_id: 3
exec someProcedure(3,6);
exec someProcedure(3,7);
exec someProcedure(6,9);
PL/SQL procedure successfully completed.
...,然后再次使用START_WITH_DEPT_ID = 4 (没有孩子且无事可做的地方):
SQL> /
Enter value for start_with_dept_id: 4
PL/SQL procedure successfully completed.