使用递归从查询中的一个表中获取多个摘要
我想在递归查询中执行此操作。我尽力使问题清楚,如果您有任何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' 我们不会有任何结果名。
我要查询(或程序),可以给我上面的查询的所有结果在一个查询
作为方法之一(或许可以被优化),你可以做到以下几点。
这是我们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'SYS_CONNECT_BY_PATH(d.d_name,' - ')'也可以作为选择! – 2014-09-22 11:14:41
我发现了一些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
@NicholasKrasnov我修正了它,它应该被referenced_name。无论如何有没有一个查询或程序来做到这一点? – Moudiz 2014-09-22 10:17:33