首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Oracle PL/SQL中获取调用过程或函数的名称

在Oracle PL/SQL中获取调用过程或函数的名称
EN

Stack Overflow用户
提问于 2011-09-02 01:18:38
回答 2查看 37K关注 0票数 19

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

显然,我可以将name作为参数传递,但最好是进行系统调用或其他方式来获取信息-如果不是从过程/函数调用,它可能只返回null或其他值。

如果没有解决这个问题的方法,那也没关系--只是好奇它是否可行(搜索什么都没有)。

EN

回答 2

Stack Overflow用户

发布于 2011-09-02 01:31:52

我找到了这个论坛: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>
票数 13
EN

Stack Overflow用户

发布于 2021-10-06 21:18:02

基本上,您所需要做的就是定义var,并在调用中将它们传递给一个实用方法,以便用值填充它们:

create or replace procedure some_test_proc (p_some_int int) 
is
    owner_name VARCHAR2 (100);
    caller_name VARCHAR2 (100);
    line_number NUMBER;
    caller_type VARCHAR2 (100);
begin
    ....
    OWA_UTIL.WHO_CALLED_ME (owner_name,caller_name,line_number,caller_type);
    -- now you can insert those values along with systimestamp into a log file
    ....
end;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7273982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档