Oracle PL / SQL:如何获取堆栈跟踪,包名称和过程名称

时间:2011-08-11 20:26:38

标签: oracle exception-handling plsql stack-trace

有时异常返回类似于:“ORA-06502:PL / SQL:数字或值错误: 字符串缓冲区太小“。

它不是那么可读,因为它既没有报告表,也没有报告它试图写的值。

在异常发生或被捕获时获取当前过程名称会很有用。

我怎样才能获得?

4 个答案:

答案 0 :(得分:36)

您可能需要DBMS_UTILITY.FORMAT_ERROR_BACKTRACE功能

SQL> ed
Wrote file afiedt.buf

  1  create or replace procedure p1
  2  is
  3  begin
  4    raise_application_error( -20001, 'Error 1', true );
  5* end;
SQL> /

Procedure created.

SQL> create or replace procedure p2
  2  as
  3  begin
  4    null;
  5    p1;
  6  end;
  7  /

Procedure created.

SQL> begin
  2    p2;
  3  exception
  4    when others then
  5      dbms_output.put_line( dbms_utility.format_error_backtrace );
  6  end;
  7  /
ORA-06512: at "SCOTT.P1", line 4
ORA-06512: at "SCOTT.P2", line 5
ORA-06512: at
line 2


PL/SQL procedure successfully completed.

答案 1 :(得分:9)

答案 2 :(得分:7)

或者您可以使用DBMS_DEBUG.PRINT_BACKTRACE

答案 3 :(得分:6)

我使用DBMS_UTILITY.FORMAT_ERROR_STACKDBMS_UTILITY.FORMAT_ERROR_BACKTRACE的组合。 (改善贾斯汀洞穴的答案)

when others then
  Dbms_Output.put_line ( DBMS_UTILITY.FORMAT_ERROR_STACK() );
  Dbms_Output.put_line ( DBMS_UTILITY.FORMAT_ERROR_BACKTRACE() );

这会在第一行和下一行的堆栈中给出错误:( Justin Cave给出的示例输出)

ORA-20001: Error 1
ORA-06512: at "SCOTT.X1", line 4
ORA-06512: at "SCOTT.X2", line 5
ORA-06512: at line 2