我想在递归查询中执行此操作.我尽力使问题清楚如果你有任何问题很快得到答案
我有4个测试程序:PRC_TEST1,PRC_TEST2,PRC_TEST3,prc_test4
在PRC_TEST1内部,它正在执行PRC_TEST2 …并且PRC_TEST2正在执行prc_test3.并且prc_test3正在执行prc_test4
create or replace procedure prc_test1 as begin prc_test2(); end; / create or replace procedure prc_test2 as begin prc_test3(); end; / create or replace procedure prc_test3 as begin prc_test4(); end; / create or replace procedure prc_test4 as begin null; end; /
我想从递归查询中知道什么是prc_test2正在执行,同时我想知道该过程被引用..以下示例查询将解释我的结果.
在下面的查询中,我正在检查prc_test2引用的位置.
select referenced_name from user_dependencies where name =’PRC_TEST2′
第一个查询会给我prc_test3,因为PRC_test2正在执行prc_test3
然后我检查prc_test3是否正在执行一个程序
select referenced_name from user_dependencies where name =’PRC_TEST3′
当然结果将是prc_test4
同时我想知道是否有程序通过查询执行prc_test2 ..我可以知道
select name from user_dependencies where referenced_name=’PRC_TEST2′
我得到结果prc_test1,然后我确定是否有一个调用prc_test1的过程
select name from user_dependencies where referenced_name=’PRC_TEST1′
we will have no results.
我想要一个查询(或一个过程),它可以在一个查询中给我上述查询的所有结果
解决方法
作为方法之一(可能可以优化),您可以执行以下操作.
以下是我们的4个测试程序:
create or replace procedure proc4 as begin null; end; / create or replace procedure proc3 as begin proc4; end; / create or replace procedure proc2 as begin proc3; end; / create or replace procedure proc1 as begin proc2; end; /
和依赖树:
with dependencies(d_name,d_referenced_name) as( select nvl(d1.name,d2.referenced_name),d1.referenced_name from user_dependencies d1 full join user_dependencies d2 on (d1.name = d2.referenced_name) where d1.type = 'PROCEDURE' or d2.type = 'PROCEDURE' ) select concat( lpad('-',3*level,'-'),d.d_name) as res from dependencies d start with d.d_name = 'PROC1' connect by d.d_name = prior d.d_referenced_name
结果:
RES ------------------ ---PROC1 ------PROC2 ---------PROC3 ------------PROC4
SQLFiddle demo