##创建日志表
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包可以打印存储过程中出错的位置,对于问题分析很有帮助