Oracle 使用递归从查询中的一个表中获取多个结果

Oracle 使用递归从查询中的一个表中获取多个结果,oracle,Oracle,我想在递归查询中这样做。如果你有任何问题,我会尽快回答 我有4个测试程序:PRC_测试1、PRC_测试2、PRC_测试3、PRC_测试4 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 b

我想在递归查询中这样做。如果你有任何问题,我会尽快回答

我有4个测试程序:PRC_测试1、PRC_测试2、PRC_测试3、PRC_测试4

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_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引用的位置

从用户依赖项中选择引用的\u名称,其中name='PRC\u TEST2'

第一个查询将给出prc_test3,因为prc_test2正在执行prc_test3 然后我检查prc_test3是否正在执行一个过程

从用户依赖项中选择引用的\u名称,其中name='PRC\u TEST3'

当然,结果将是prc_测试4

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的过程。。通过询问,我可以知道这一点

从引用的用户依赖项中选择名称\u name='PRC\u TEST2'

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

从引用的用户依赖项中选择名称\u name='PRC\u 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

我发现了类似的东西

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

@尼古拉斯·克拉斯诺夫我修正了它,它应该被引用为你的名字。无论如何,是否有查询或过程可以这样做?+1
SYS\u CONNECT\u BY\u PATH(d.d\u name,“-”)
也可以选择!