2014-09-22 56 views
4

我想在递归查询中执行此操作。我尽力使问题清楚,如果您有任何questiong生病答案很快使用递归从查询中的一个表中获取多个摘要

我有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是exeucting,并在同一时间,我想知道这个过程是参照..下面的例子查询将解释我的结果。

在下面的查询我正在检查prc_test2引用的位置。

选择referenced_name从user_dependencies其中name = 'PRC_TEST2'

第一个查询会给我prc_test3,监守PRC_test2正在执行prc_test3 然后我检查是否prc_test3正在执行的程序

select referenced_name from user_dependencies其中name ='PRC_TEST3'

和ofcourse结果将在同一时间,我想知道是否有执行prc_test2程序。通过查询,我可以知道

从选择被prc_test4

user_dependencies其中referenced_name ='PRC_TEST2'

我得到结果prc_test1,然后我确定是否有一个过程调用prc_test1

选择user_dependencies其中referenced_name = 'PRC_TEST1' 我们不会有任何结果

我要查询(或程序),可以给我上面的查询的所有结果在一个查询

+0

@NicholasKrasnov我修正了它,它应该被referenced_name。无论如何有没有一个查询或程序来做到这一点? – Moudiz 2014-09-22 10:17:33

回答

4

作为方法之一(或许可以被优化),你可以做到以下几点。

这是我们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

+1

+1'SYS_CONNECT_BY_PATH(d.d_name,' - ')'也可以作为选择! – 2014-09-22 11:14:41

1

我发现了一些SIM卡ilar对此

SELECT  
      t2.name AS parent_name, 
      t1.name, 
      t1.REFERENCED_NAME as calling_to 
     -- t2.REFERENCED_NAME AS p_reference 
     FROM user_dependencies t1 
LEFT JOIN user_dependencies t2 ON t1.name = T2.REFERENCED_NAME 
START WITH t1.name = 'PRC_TEST2' 
CONNECT BY PRIOR t1.NAME = T1.REFERENCED_NAME