【问题标题】:Find out where stored proc is called from - [Oracle]找出从哪里调用存储过程 - [Oracle]
【发布时间】:2014-06-27 07:50:50
【问题描述】:

如何找出我的存储过程FOO 是从哪里调用的(调用过程的名称)? 我正在尝试找出在什么类型的情况下调用FOO,并且查询SELECT * FROM user_source 似乎很麻烦,因为存在包含FOO 的字符串文字。

问候, 机器人

【问题讨论】:

    标签: oracle stored-procedures


    【解决方案1】:

    您可以使用ALL_DEPENDENCIES 视图:

    select * from all_dependencies 
    where referenced_owner = <username>
    and referenced_name = 'FOO';
    

    这将返回所有直接使用您的过程FOO 的对象。但是,如果一个过程在动态 SQL 语句中使用 FOO,您要么必须解析源代码,要么可以尝试在 FOO 过程中添加记录调用堆栈(在实际应用程序中,这将被记录到一张桌子而不是dbms_output):

    create or replace procedure foo as
    begin
      dbms_output.put_line('foo');
      dbms_output.put_line(dbms_utility.format_call_stack());
      end;
    
    create procedure bar as
    begin
      dbms_output.put_line('bar');
      foo();
    end;  
    
    begin
      bar();
    end;
    

    输出:

    bar
    foo
    ----- PL/SQL Call Stack -----
      object      line  object
      handle    number  name
    00000003E180A118         4  procedure SCHMITT.FOO
    00000003E180E140         4  procedure SCHMITT.BAR
    00000003E17FA388         2  anonymous block
    

    但是,这仅在实际调用使用您的函数的代码时才有效:-)

    【讨论】:

      【解决方案2】:

      如果您想在运行时获取此信息,请尝试OWA_UTIL.WHO_CALLED_ME

      OWA_UTIL.WHO_CALLED_ME(
         owner          OUT      VARCHAR2,
         name           OUT      VARCHAR2,
         lineno         OUT      NUMBER,
         caller_t       OUT      VARCHAR2);
      

      如果此过程不存在,请查看 Tom Kyte 的这篇帖子:
      How Can I find out who called me or what my name is

      【讨论】:

      • 感谢您的建议,但这不是我要找的。这需要我知道某个用例,但这里不是这种情况,我仍在试图弄清楚系统中发生了什么。我什至不知道如何调用调用函数:)
      猜你喜欢
      • 1970-01-01
      • 2011-04-25
      • 2015-05-22
      • 2012-01-27
      • 2017-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多