有时异常返回类似于:“ORA-06502:PL / SQL:数字或值错误: 字符串缓冲区太小“。
它不是那么可读,因为它既没有报告表,也没有报告它试图写的值。
在异常发生或被捕获时获取当前过程名称会很有用。
我怎样才能获得?
答案 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_STACK和DBMS_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