plsql - 调用一个过程直到孩子存在plsql
问题描述
我在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 的孩子(这里它不存在)等等,也许我需要为此准备某种递归函数,但对如何实现这一点不太了解,请问有什么帮助吗?
解决方案
分层查询在这里可能工作得很好。
尝试在“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;
例如...
给定:包含以下数据的表 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.
推荐阅读
- android - Android:如何格式化 getIntent().getIntExtra
- angular - 在primeng数据表中导出pdf在Angular 9中不起作用
- mysql - 使用 MySQL 查看特定列在另一列中是否有两个唯一值时,如何从表中选择 *?
- python - 使用套接字模块在不同网络上的两台计算机之间进行通信
- python - 为什么shutil.copy2有时会修改文件的st_mtime?
- python - 印刷品的含义及其执行方式是什么?
- javascript - JS在循环内应用函数
- python - 为什么这个正则表达式不适用于 re.search?
- javascript - 当我尝试检索它时,类组件中的状态变量未定义
- python - 如何在 matplotlib 中生成矩形箱线图?