##创建日志表
create table t_error_log
(
pro_name varchar2(300),
error_desc varchar2(2000),
exec_date date
);
##创建测试表
create table test_error_stack(
id number primary key
);
##插入测试数据
insert into test_error_stack values (1);
commit;
##创建存储过程
create or replace procedure pr_error_code_test
is
v_backtrace varchar2(1000); --返回错误行
v_error varchar2(1000); --整合错误内容
begin
--要执行的sql语句
INSERT INTO test_error_stack values (2);
INSERT INTO test_error_stack values (1); --这条数据会报错,违反唯一约束
commit;
--异常错误记录处理
exception
when others then
v_backtrace:=dbms_utility.format_error_backtrace;
rollback;
v_error:='异常错误为:'||v_backtrace;
insert into t_pro_error_log(pro_name,error_desc,exec_date)
values('pr_error_code_test',v_error,sysdate);
commit;
return;
end pr_error_code_test;
/
##执行存储过程
exec pr_error_code_test;
##检查结果
SQL> select * from t_error_log;
PRO_NAME ERROR_DESC EXEC_DATE
-------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -------------------- -----------
pr_error_code_test 异常错误为:ORA-06512: 在 "PR_ERROR_CODE_TEST", line 9 2020/10/14
SQL>
SQL> select * from test_error_stack;
ID
----------
1
SQL>
##结论
通过dbms_utility.format_error_backtrace包可以打印存储过程中出错的位置,对于问题分析很有帮助
本文展示了如何在Oracle数据库中创建日志表、测试表并插入数据,然后定义一个存储过程来处理异常。当存储过程中发生错误时,使用DBMS_UTILITY.FORMAT_ERROR_BACKTRACE捕获错误信息,并将这些信息记录到日志表中,这对于故障排查非常有帮助。
308

被折叠的 条评论
为什么被折叠?



