提问人:Revious 提问时间:8/12/2011 最后编辑:APCRevious 更新时间:9/16/2016 访问量:112118
Oracle PL/SQL:如何获取堆栈跟踪、包名称和过程名称
Oracle PL/SQL: how to get the stack trace, package name and procedure name
问:
有时异常会返回如下内容:“ORA-06502:PL/SQL:数值或值错误: 字符串缓冲区太小”。
它的可读性不强,因为它既不报告表、列也不报告它试图写入的值。
在异常发生或捕获时获取当前过程名称会很有用。
我怎样才能获得它?
答:
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_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
评论
1赞
lav
5/17/2017
最好使用 Dbms_Output.PUT,因为错误堆栈/跟踪已经包含一个新行字符。
上一个:为什么回调比承诺更“紧密耦合”?
下一个:使用最大日期记录
评论