我想在递归查询中执行此操作。我尽力使问题清楚如果你有任何问题很快回答
我有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引用的位置。
从user_dependencies中选择 referenced_name ,其中name ='PRC_TEST2'
第一个查询会给我prc_test3,因为PRC_test2正在执行prc_test3 然后我检查prc_test3是否正在执行一个程序
从user_dependencies中选择 referenced_name ,其中name ='PRC_TEST3'
当然结果将是prc_test4
同时我想知道是否有程序通过查询执行prc_test2 ..我可以知道
从user_dependencies中选择 name ,其中referenced_name ='PRC_TEST2'
我得到结果prc_test1,然后我确定是否有一个程序调用prc_test1
从user_dependencies中选择 name ,其中referenced_name ='PRC_TEST1' 我们没有结果。
我想要一个查询(或程序),可以在一个查询中给我上述查询的所有结果
答案 0 :(得分: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
答案 1 :(得分:1)
我发现了与此类似的东西
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