我正在处理一个pl-sql脚本,其中我有大约10次TO_CHAR转换。
其中一人正在投掷
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
异常。
目前,我使用这段代码记录消息
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.put_line('Exception message is '||SQLERRM(sqlcode));
ROLLBACK;
我想添加(主要用于调试目的)引发异常的行,以便以
的形式接收消息ORA-06502: PL/SQL: numeric or value error: character string buffer too small (at line x)
有一种简单的方法吗?
答案 0 :(得分:17)
您需要使用10g
DBMS_OUTPUT.put_line('Error in '|| $$plsql_unit || ' at ' || $$plsql_line);
也考虑使用
DBMS_UTILITY.format_error_backtrace
2005年4月,Steven Feuerstein在Oracle杂志上发表了一篇文章:
http://www.oracle.com/technetwork/issue-archive/2005/05-mar/o25plsql-093886.html
干杯,niels
答案 1 :(得分:13)
答案提到了$$PLSQL_LINE & DBMS_UTILITY.FORMAT_ERROR_BACKTRACE
。但我想补充一下它们之间的区别:
$$PLSQL_LINE & $$PLSQL_UNIT
ORA-XXXXX: at "<program_unit_name>", line xx
的字符串。因此,如果您有兴趣提取行号本身,无论您想要什么日志记录目的,您都需要解析字符串。 最后,为了明确区别,下面是两个程序,内容相同。您可以运行它们并注意输出差异
CREATE OR REPLACE PROCEDURE proc_plsql_line
IS
BEGIN
RAISE VALUE_ERROR;
EXCEPTION
WHEN VALUE_ERROR
THEN
DBMS_OUTPUT.put_line ( 'Error raised in: '|| $$plsql_unit ||' at line ' || $$plsql_line || ' - '||sqlerrm);
END;
/
和
CREATE OR REPLACE PROCEDURE proc_backtrace
IS
BEGIN
RAISE VALUE_ERROR;
EXCEPTION
WHEN VALUE_ERROR
THEN
DBMS_OUTPUT.put_line ( 'Error raised: '|| DBMS_UTILITY.FORMAT_ERROR_BACKTRACE || ' - '||sqlerrm);
END;
/
执行:
exec proc_plsql_line;
Error raised in: PROC_PLSQL_LINE at line 8 - ORA-06502: PL/SQL: numeric or value error
exec proc_backtrace;
Error raised: ORA-06512: at "PROC_BACKTRACE", line 4 - ORA-06502: PL/SQL: numeric or value error
答案 2 :(得分:4)
DBMS_UTILITY.format_error_backtrace 语句会为您提供行号
begin
select 1/0 from dual;
exception
when others then
dbms_output.put_line('ERROR_STACK: ' || DBMS_UTILITY.FORMAT_ERROR_STACK);
dbms_output.put_line('ERROR_BACKTRACE: ' || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
end;
答案 3 :(得分:2)
你需要10克或以上。检查DBMS_UTILITY.FORMAT_ERROR_BACKTRACE。
http://www.oracle.com/technetwork/issue-archive/2005/05-mar/o25plsql-093886.html
答案 4 :(得分:0)
你可以把你的异常处理程序放在每个语句周围。