【问题标题】:Get the name of the calling procedure or function in Oracle PL/SQL获取Oracle PL/SQL中调用过程或函数的名称
【发布时间】:2011-09-01 17:18:37
【问题描述】:

有谁知道 PL/SQL 过程(在这种情况下是一个错误记录过程)是否有可能获取调用它的函数/过程的名称?

显然,我可以将名称作为参数传递,但最好进行系统调用或其他获取信息的方法 - 如果不是从过程/函数调用它,它可能会返回 null 或其他内容.

如果没有方法可以解决这个问题 - 只是好奇它是否可能(搜索不会产生任何结果)。

【问题讨论】:

  • @APC 感谢两位的建议。我查看了 OWA_Util 包中的 who_call_me 过程和 format_call_stack 函数。我肯定会使用 who_call_me 过程。一些搜索表明有可能(但不是万无一失)获取实际函数/过程名称的方法。 (见这里:link/httpasktomoraclecomtkytewhocallme.html)。我也可以添加调用堆栈,具体取决于此应用程序的“深度”!问候,保罗
  • PS - 如果有人能告诉我如何格式化我之前的评论,我将不胜感激,参考“markdown”指南尝试了几次,但无法显示换行符!

标签: oracle function plsql procedure


【解决方案1】:

有一个名为OWA_UTIL 的包(在旧版本的数据库中默认不安装)。这有一个方法WHO_CALLED_ME(),它返回OWNER、OBJECT_NAME、LINE_NO 和CALLER_TYPE。请注意,如果调用者是一个打包的过程,它将返回 PACKAGE 名称而不是过程名称。在这种情况下,无法获取过程名称;这是因为过程名可以重载,所以不一定很有用。

Find out more


从 10gR2 开始还有$$PLSQL_UNIT 特殊功能;这也将返回 OBJECT NAME(即包未打包的过程)。

【讨论】:

    【解决方案2】:

    我找到了这个论坛:http://www.orafaq.com/forum/t/60583/0/。它可能就是您正在寻找的。​​p>

    基本上,您可以使用 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>
    

    【讨论】:

      【解决方案3】:

      基本上,您需要做的就是定义 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;
      

      【讨论】:

        猜你喜欢
        • 2016-09-28
        • 1970-01-01
        • 1970-01-01
        • 2011-04-12
        • 1970-01-01
        • 1970-01-01
        • 2021-05-06
        • 2010-11-06
        • 1970-01-01
        相关资源
        最近更新 更多