Oracle 日誌記錄工具類
阿新 • • 發佈:2018-11-08
在我們編寫儲存過程,或者PKG時,總有一些異常情況考慮不到;為了快速排查定位問題,需要及時記錄異常日誌; 1.建表語句 : 異常日誌表;正常日誌表
create table SSS.TC_EXCEPTION_LOG ( log_id NUMBER(20) not null, package_name VARCHAR2(120), proc_name VARCHAR2(120), exception_tm DATE default sysdate, exception_code VARCHAR2(200), exception_desc VARCHAR2(1000), exception_remk VARCHAR2(600), line_no NUMBER(10) ); comment on table SSS.TC_EXCEPTION_LOG is '系統異常日誌資料'; comment on column SSS.TC_EXCEPTION_LOG.log_id is '主鍵'; comment on column SSS.TC_EXCEPTION_LOG.package_name is '包名'; comment on column SSS.TC_EXCEPTION_LOG.proc_name is '過程名'; comment on column SSS.TC_EXCEPTION_LOG.exception_tm is '異常時間'; comment on column SSS.TC_EXCEPTION_LOG.exception_code is '異常編碼'; comment on column SSS.TC_EXCEPTION_LOG.exception_desc is '異常描述'; comment on column SSS.TC_EXCEPTION_LOG.exception_remk is '異常說明'; comment on column SSS.TC_EXCEPTION_LOG.line_no is '異常行號'; create index SSS.IDX_TC_EXCEPTION_LOG1 on SSS.TC_EXCEPTION_LOG (PROC_NAME); alter table SSS.TC_EXCEPTION_LOG add constraint IPK_TC_EXCEPTION_LOG primary key (LOG_ID); create table SSS.TC_EXECUTE_LOG ( log_id NUMBER(20) not null, package_name VARCHAR2(120), proc_name VARCHAR2(120), strat_tm DATE default sysdate not null, end_tm DATE, spend_tm NUMBER(10), ref_data_rows NUMBER(10), remk VARCHAR2(1000) ); comment on table SSS.TC_EXECUTE_LOG is '公用執行日誌表'; comment on column SSS.TC_EXECUTE_LOG.log_id is '執行日誌ID'; comment on column SSS.TC_EXECUTE_LOG.package_name is '包名'; comment on column SSS.TC_EXECUTE_LOG.proc_name is '過程名'; comment on column SSS.TC_EXECUTE_LOG.strat_tm is '執行開始時間'; comment on column SSS.TC_EXECUTE_LOG.end_tm is '執行結束時間'; comment on column SSS.TC_EXECUTE_LOG.spend_tm is '執行花費時間(單位: 0.01秒)'; comment on column SSS.TC_EXECUTE_LOG.ref_data_rows is '執行涉及資料量'; comment on column SSS.TC_EXECUTE_LOG.remk is '註釋'; create index SSS.INK_TC_EXECUTE_LOG_01 on SSS.TC_EXECUTE_LOG (PACKAGE_NAME, PROC_NAME, REMK); create index SSS.INK_TC_EXECUTE_LOG_02 on SSS.TC_EXECUTE_LOG (STRAT_TM); alter table SSS.TC_EXECUTE_LOG add constraint IPK_TC_EXECUTE_LOG primary key (LOG_ID, STRAT_TM);
2. 記錄異常的PKG
CREATE OR REPLACE PACKAGE BODY SSS.PKG_SYS_LOG IS --************************************************************* -- AUTHOR : KELIVEN LIU -- CREATED : 2008-05-20 -- PURPOSE : 記錄系統中儲存過程執行日誌 -- PARAMETER: -- P_PACKAGE_NAME VARCHAR2 包名 -- P_PROC_NAME VARCHAR2, 過程名 -- P_EXCEP_DT DATE, 執行日期 -- P_EXCEP_CODE VARCHAR2, 異常程式碼 -- P_EXCEP_DESC VARCHAR2, 異常描述資訊 -- P_EXCEP_REMK VARCHAR2, 備註,可能的值為'BEGIN','END','ERROR' -- P_LINE_NO NUMBER 行號 -- MODIFY HISTORY -- PERSON DATE COMMENTS -- ------------------------------------------------------------- --************************************************************* --************************************************************* -- AUTHOR : KELIVEN LIU -- CREATED : 2008-05-20 -- PURPOSE : 記錄系統中儲存過程執行日誌 -- PARAMETER: -- NAME TYPE DESC -- P_SEQ_NO NUMBER 發生異常儲存過程中主要sequence的當前值 -- P_PROC_NAME VARCHAR2 儲存過程名 -- P_EXCEP_DT DATE 時間,包括開始時間,結束時間,異常發生時間 -- P_EXCEP_CODE VARCHAR2 異常程式碼 -- P_EXCEP_DESC VARCHAR2 異常描述資訊 -- P_EXCEP_REMK VARCHAR2 備註,可能的值為'BEGIN','END','ERROR' -- P_LINE_NO NUMBER 行號 -- P_PACKAGE_NAME VARCHAR2, 包名 -- P_PROC_NAME VARCHAR2, 過程名 -- P_EXEC_START_TM DATE, 執行開始時間 -- P_EXEC_END_TM DATE, 執行結束時間 -- P_EXEC_PEND_TM NUMBER, 執行花費時間 -- P_EXEC_REF_DATA_ROWS NUMBER, 涉及資料量 -- P_EXEC_REMK VARCHAR2 備註,可能的值為'BEGIN','END','ERROR' -- MODIFY HISTORY -- PERSON DATE COMMENTS -- ------------------------------------------------------------- --************************************************************* PROCEDURE ERROR_LOG(P_PACKAGE_NAME VARCHAR2, P_PROC_NAME VARCHAR2, P_EXCEP_DT DATE, P_EXCEP_CODE VARCHAR2, P_EXCEP_DESC VARCHAR2, P_EXCEP_REMK VARCHAR2, P_LINE_NO NUMBER) AS PRAGMA AUTONOMOUS_TRANSACTION; BEGIN INSERT INTO TC_EXCEPTION_LOG (LOG_ID, PACKAGE_NAME, PROC_NAME, EXCEPTION_TM, EXCEPTION_CODE, EXCEPTION_DESC, EXCEPTION_REMK, LINE_NO) VALUES (SEQ_LOG.NEXTVAL, SUBSTR(P_PACKAGE_NAME, 1, 120), SUBSTR(P_PROC_NAME, 1, 120), P_EXCEP_DT, SUBSTR(P_EXCEP_CODE, 1, 200), SUBSTR(P_EXCEP_DESC, 1, 1000), SUBSTR(P_EXCEP_REMK, 1, 600), P_LINE_NO); COMMIT; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('STP_RUNNING_LOG' || SQLCODE || ':' || SQLERRM); ROLLBACK; END ERROR_LOG; ---系統執行日誌 PROCEDURE EXECUTE_LOG(P_PACKAGE_NAME VARCHAR2, P_PROC_NAME VARCHAR2, P_EXEC_START_TM DATE, P_EXEC_END_TM DATE, P_EXEC_PEND_TM NUMBER, P_EXEC_REF_DATA_ROWS NUMBER, P_EXEC_REMK VARCHAR2) AS PRAGMA AUTONOMOUS_TRANSACTION; BEGIN INSERT INTO TC_EXECUTE_LOG (LOG_ID, PACKAGE_NAME, PROC_NAME, STRAT_TM, END_TM, SPEND_TM, REF_DATA_ROWS, REMK) VALUES (SEQ_LOG.NEXTVAL, SUBSTR(P_PACKAGE_NAME, 1, 120), SUBSTR(P_PROC_NAME, 1, 120), P_EXEC_START_TM, P_EXEC_END_TM, P_EXEC_PEND_TM, P_EXEC_REF_DATA_ROWS, SUBSTR(P_EXEC_REMK, 1, 1000)); COMMIT; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('TC_EXECUTE_LOG' || SQLCODE || ':' || SQLERRM); ROLLBACK; END EXECUTE_LOG; END PKG_SYS_LOG; /