如何找出调用存储过程FOO
的位置(调用过程的名称)?
我试图找出调用FOO
的情况类型,查询SELECT * FROM user_source
似乎非常麻烦,因为有些字符串文字包含FOO
。
此致 Robotron游戏
答案 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
但是,这只有在实际调用使用您的函数的代码时才会起作用: - )