2014-09-22 57 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