首页 > 解决方案 > 调用一个过程直到孩子存在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 的孩子(这里它不存在)等等,也许我需要为此准备某种递归函数,但对如何实现这一点不太了解,请问有什么帮助吗?

标签: plsql

解决方案


分层查询在这里可能工作得很好。

尝试在“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.

推荐阅读