找出从哪里调用存储过程 - [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]的主要内容,如果未能解决你的问题,请参考以下文章