是否有人知道PL / SQL过程(在这种情况下是错误记录过程)是否可以获取调用它的函数/过程的名称?
显然我可以将名称作为参数传递,但是进行系统调用或获取信息的东西会很好 - 如果没有从过程/函数中调用它,它可能只返回null或者其他东西
如果没有方法可以做到这一点 - 只是好奇是否可能(搜索没有产生任何结果)。
答案 0 :(得分:15)
有一个名为OWA_UTIL
的软件包(默认情况下,在旧版本的数据库中未安装)。这有一个方法WHO_CALLED_ME()
,它返回OWNER,OBJECT_NAME,LINE_NO和CALLER_TYPE。请注意,如果调用者是打包过程,它将返回PACKAGE名称而不是过程名称。在这种情况下,无法获取程序名称;这是因为过程名称可能会重载,所以它不一定非常有用。
自10gR2起,还有$$PLSQL_UNIT
特殊功能;这也将返回OBJECT NAME(即包未打包的程序)。
答案 1 :(得分:12)
我找到了这个论坛:http://www.orafaq.com/forum/t/60583/0/。它可能就是你在寻找的东西。
基本上,您可以使用Oracle提供的dbms_utility.format_call_stack
:
scott@ORA92> CREATE TABLE error_tab
2 (who_am_i VARCHAR2(61),
3 who_called_me VARCHAR2(61),
4 call_stack CLOB)
5 /
Table created.
scott@ORA92>
scott@ORA92> CREATE OR REPLACE PROCEDURE d
2 AS
3 v_num NUMBER;
4 v_owner VARCHAR2(30);
5 v_name VARCHAR2(30);
6 v_line NUMBER;
7 v_caller_t VARCHAR2(100);
8 BEGIN
9 select to_number('a') into v_num from dual; -- cause error for testing
10 EXCEPTION
11 WHEN OTHERS THEN
12 who_called_me (v_owner, v_name, v_line, v_caller_t);
13 INSERT INTO error_tab
14 VALUES (who_am_i,
15 v_owner || '.' || v_name,
16 dbms_utility.format_call_stack);
17 END d;
18 /
Procedure created.
scott@ORA92> SHOW ERRORS
No errors.
scott@ORA92> CREATE OR REPLACE PROCEDURE c
2 AS
3 BEGIN
4 d;
5 END c;
6 /
Procedure created.
scott@ORA92> CREATE OR REPLACE PROCEDURE b
2 AS
3 BEGIN
4 c;
5 END b;
6 /
Procedure created.
scott@ORA92> CREATE OR REPLACE PROCEDURE a
2 AS
3 BEGIN
4 b;
5 END a;
6 /
Procedure created.
scott@ORA92> execute a
PL/SQL procedure successfully completed.
scott@ORA92> COLUMN who_am_i FORMAT A13
scott@ORA92> COLUMN who_called_me FORMAT A13
scott@ORA92> COLUMN call_stack FORMAT A45
scott@ORA92> SELECT * FROM error_tab
2 /
WHO_AM_I WHO_CALLED_ME CALL_STACK
------------- ------------- ---------------------------------------------
SCOTT.D SCOTT.C ----- PL/SQL Call Stack -----
object line object
handle number name
6623F488 1 anonymous block
66292138 13 procedure SCOTT.D
66299430 4 procedure SCOTT.C
6623D2F8 4 procedure SCOTT.B
6624F994 4 procedure SCOTT.A
66299984 1 anonymous block
scott@ORA92>