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

Oracle PL/SQL: how to get the stack trace, package name and procedure name

提问人:Revious 提问时间:8/12/2011 最后编辑:APCRevious 更新时间:9/16/2016 访问量:112118

问:

有时异常会返回如下内容:“ORA-06502:PL/SQL:数值或值错误: 字符串缓冲区太小”。

它的可读性不强,因为它既不报告表、列也不报告它试图写入的值。

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

我怎样才能获得它?

Oracle 异常 PLSQL 堆栈跟踪

评论


答:

54赞 Justin Cave 8/12/2011 #1

你可能想要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.
7赞 mamboking 8/12/2011 #2

或者你可以使用DBMS_DEBUG。PRINT_BACKTRACE

11赞 xmedeko 10/27/2014 #3

或者试试DBMS_UTILITY。FORMAT_CALL_STACK

14赞 Roeland Van Heddegem 9/16/2016 #4

我使用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

评论

1赞 lav 5/17/2017
最好使用 Dbms_Output.PUT,因为错误堆栈/跟踪已经包含一个新行字符。