1. 程式人生 > >Oracle 日誌記錄工具類

Oracle 日誌記錄工具類


在我們編寫儲存過程,或者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;
/