调用一个过程,直到子进程存在plsql

时间:2019-03-01 09:42:12

标签: 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的子代(此处不存在)执行,等等继续,也许我需要为此准备某种递归函数,但对如何实现这一点了解不多,请帮忙吗?

1 个答案:

答案 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.