oracle存储过程最好的记录错误方式
当你的应用有调用存储过程,而节点有几十个或者上百个,找错是不是一个很麻烦的事情,这个时候,我建议写到数据库中,下面是我做的一个demo.
1. 建立错误日志记录表
drop table PUB_PROC_ERR_LOG purge; create table PUB_PROC_ERR_LOG ( LOG_ID NUMBER, MODULE_NAME VARCHAR2(100), PROC_NAME VARCHAR2(100), ERR_TIME DATE, SQL_CODE VARCHAR2(50), SQL_ERRM VARCHAR2(100), ERR_CONTENT VARCHAR2(500) ); comment on column PUB_PROC_ERR_LOG.LOG_ID is '主键'; comment on column PUB_PROC_ERR_LOG.MODULE_NAME is '模块名称'; comment on column PUB_PROC_ERR_LOG.PROC_NAME is '存储过程名称'; comment on column PUB_PROC_ERR_LOG.ERR_TIME is '报错时间'; comment on column PUB_PROC_ERR_LOG.SQL_CODE is 'SQLCODE'; comment on column PUB_PROC_ERR_LOG.SQL_ERRM is 'SQLERRM'; comment on column PUB_PROC_ERR_LOG.ERR_CONTENT is '报错的具体行';
2. 表主键的序列
create sequence SEQ_RECORD_PROC_ERR minvalue 1 maxvalue 9999999999999999999999999999 start with 21 increment by 1 cache 20;
3.通用记录错误存储过程,用自治事务
CREATE OR REPLACE PROCEDURE record_proc_err_log(module_name varchar2, proc_name varchar2, v_SQLCODE varchar2, v_SQLERRM varchar2, v_err_line varchar2) is PRAGMA AUTONOMOUS_TRANSACTION; BEGIN insert into pub_proc_err_log (log_id, module_name, proc_name, err_time, sql_code, sql_errm, err_content) values (seq_record_proc_err.nextval, module_name, proc_name, sysdate, v_SQLCODE, v_SQLERRM, v_err_line); commit; END record_proc_err_log;
4.测试一下
CREATE OR REPLACE PROCEDURE proce_test
is
BEGIN
EXECUTE IMMEDIATE 'delete from test2 where';
Exception
WHEN OTHERS Then
record_proc_err_log('模块名','proce_test()',SQLCODE,SQLERRM,
substr(dbms_utility.format_error_backtrace, 1, 400));
--raise; 如果是java代码调用存储过程,则需要写这一段,让存储过程错误上抛
END proce_test;
SQL> exec proce_test();
BEGIN proce_test(); END;
*
第 1 行出现错误:
ORA-00936: 缺失表达式
ORA-06512: 在 "LCAMTEST.PROCE_TEST", line 9
ORA-06512: 在 line 1
SQL> select * from pub_proc_err_log;
LOG_ID MODULE_NAME PROC_NAME ERR_TIME SQL_CODE SQL_ERRM ERR_CONTENT
10 模块名 proce_test() 04-8月 -15 -936 ORA-00936: 缺失表达式 ORA-06512: 在 "LCAMTEST.PROCE_TEST", line 4
本站文章为和通数据库网友分享或者投稿,欢迎任何形式的转载,但请务必注明出处.
同时文章内容如有侵犯了您的权益,请联系QQ:970679559,我们会在尽快处理。