【发布时间】:2014-06-27 07:50:50
【问题描述】:
如何找出我的存储过程FOO 是从哪里调用的(调用过程的名称)?
我正在尝试找出在什么类型的情况下调用FOO,并且查询SELECT * FROM user_source 似乎很麻烦,因为存在包含FOO 的字符串文字。
问候, 机器人
【问题讨论】:
如何找出我的存储过程FOO 是从哪里调用的(调用过程的名称)?
我正在尝试找出在什么类型的情况下调用FOO,并且查询SELECT * FROM user_source 似乎很麻烦,因为存在包含FOO 的字符串文字。
问候, 机器人
【问题讨论】:
您可以使用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
但是,这仅在实际调用使用您的函数的代码时才有效:-)
【讨论】:
如果您想在运行时获取此信息,请尝试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
【讨论】: