對於Oracle的存儲過程,拋出異常可以拋向代碼或是用表記錄。如果你的系統應用有很多節點,像我們40個節點,如果拋錯拋到代碼裡面,錯誤根本就無法找到,最好是錯誤用表記錄。記錄錯誤的這個功能最好是通用的。
--建立錯誤日志表 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 '報錯的具體行'; --表主鍵的序列 create sequence SEQ_RECORD_PROC_ERR minvalue 1 maxvalue 9999999999999999999999999999 start with 21 increment by 1 cache 20; --通用記錄錯誤存儲過程 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; --進行測試 create or replace procedure test_p1 is begin execute IMMEDIATE 'select from test'; exception when others then record_proc_err_log('模塊名','test_p1',SQLCODE,SQLERRM, substr(dbms_utility.format_error_backtrace, 1, 400)); end test_p1; SQL> col proc_name format a8; SQL> col err_time format a10; SQL> col sql_code format a5; SQL> col SQL_ERRM format a22; SQL> col ERR_CONTENT format a42; SQL> select proc_name,err_time,sql_code,SQL_ERRM,ERR_CONTENT from pub_proc_err_log; PROC_NAM ERR_TIME SQL_C SQL_ERRM ERR_CONTENT -------- ---------- ----- ---------------------- ------------------------------------------ test_p1 08-12月-14 -936 ORA-00936: 缺失表達式 ORA-06512: 在 "LCAM_TEST.TEST_P1", line 3