找出从哪里调用存储过程 - [Oracle]

时间:2014-06-27 07:50:51

标签: oracle stored-procedures

如何找出调用存储过程FOO的位置(调用过程的名称)? 我试图找出调用FOO的情况类型,查询SELECT * FROM user_source似乎非常麻烦,因为有些字符串文字包含FOO

此致 Robotron游戏

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您可以使用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

但是,这只有在实际调用使用您的函数的代码时才会起作用: - )