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

你可能感兴趣的:(j2ee)