如何获取Oracle PL/SQL中调用过程或函数的名称?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (31)

有人知道PL/SQL过程(在本例中是错误日志记录过程)是否有可能获得调用它的函数/过程的名称吗?

显然,我可以将名称作为参数传入,但是最好是进行系统调用或获取信息--如果没有从过程/函数调用它,它就可以返回NULL或其他什么。

提问于
用户回答回答于

有一个OWA_UTIL(默认情况下,在旧版本的数据库中未安装此选项)。这有一个方法WHO_CALLED_ME()返回所有者、对象。注意,如果调用者是一个打包的过程,它将返回包名,而不是过程名。在这种情况下,无法获得过程名称;这是因为过程名称可以重载,因此它不一定非常有用。

从10 gR2开始,也有$$PLSQL_UNIT特殊函数;这还将返回对象名称(即包而不是打包过程)。

用户回答回答于

您可以使用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>

扫码关注云+社区