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

Posted

技术标签:

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

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

问候, 机器人

【问题讨论】:

【参考方案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

【讨论】:

感谢您的建议,但这不是我要找的。这需要我知道某个用例,但这里不是这种情况,我仍在试图弄清楚系统中发生了什么。我什至不知道如何调用调用函数:)

以上是关于找出从哪里调用存储过程 - [Oracle]的主要内容,如果未能解决你的问题,请参考以下文章

oracle数据库调用存储过程

oracle死锁问题排查

c# 调用Oracle存储过程 PLS-00201:必须声明标识符

怎么把本地的存储过程导入oracle到数据库

oracle数据库job怎么调用含参数的存储过程?

oracle存储过程如何输出信息