調用路徑: 數據庫
存儲過程-》調用函數初始化TYPE裏變量-》存儲過程調用具體級別的日誌操做-》調用TYPES實現體TYPE BOBIES裏的具體Member實現體-》調用公用的Member成員存儲過程寫入syslog表。 session
代碼樣例展現: 函數
一、存儲過程 性能
- create or replace procedure sp_message_hisorderdata_create(
- p_l_date HsCrmType.LDate%TYPE,
- p_vc_customer hscrmtype.vc50%type) IS
- v_l_date HsCrmType.LDate%Type;
- v_l_currentdate HsCrmType.LDate%Type;
- v_vc_customer hscrmtype.vc50%type;
- v_l_count HsCrmType.LInt%Type;
- v_l_total HsCrmType.LInt%Type;
- v_vc_open_value HsCrmType.VC255%Type;
- v_vc_open_value_temp HsCrmType.VC255%Type;
- v_vc_customer_no HsCrmType.VC20%Type;
- vc_product_no HsCrmType.CKind%Type;
- vc_product_temp HsCrmType.CKind%Type;
- v_vc_prefix HsCrmType.CKind%Type;
- v_vc_temp1 HsCrmType.VC255%Type;
- v_vc_temp2 HsCrmType.VC255%Type;
- v_vc_temp3 HsCrmType.VC255%Type;
- v_vc_temp4 HsCrmType.VC255%TYPE;
- V_L_SPEAK_NO HsCrmType.LInt%Type;
- l_tyLog ty_logManager := ty_logManager('system','003');
- begin
- l_tyLog.up_Enter('sp_message_hisorderdata_create開始');
- v_vc_temp1 := chr(1)||' '||chr(1)||' '||chr(1)||' '||chr(1)||' ';
- v_vc_temp2 := chr(1)||' '||chr(1)||' '||chr(1)||' ';
- v_vc_temp3 := chr(1)||' '||chr(1)||' ';
- v_vc_temp4 := chr(1)||' ';
- --zhoudy 2013-01-30 添加初始化賦值
- v_vc_open_value := '';
- v_l_total := 0;
- V_L_SPEAK_NO := 0;
- v_l_date := nvl(p_l_date,0);
- v_vc_customer := nvl(p_vc_customer,' ');
- if v_l_date = 0 then
- v_l_date := to_number(to_char(SYSDATE-1,'YYYYMMDD'));
- end if;
- FOR r IN (SELECT a.vc_customer_no
- ,a.l_product_no
- ,'3' AS c_sourcetype
- ,a.l_de_begin_date AS l_de_begin_date
- ,a.l_de_end_date AS l_de_end_date
- ,(SELECT WMSYS.WM_CONCAT(b.vc_open_value) FROM hscrm_dbo.orderinfo b
- WHERE b.vc_customer_no=a.vc_customer_no
- AND b.l_product_no=a.l_product_no
- and b.l_product_no < 20000) AS vc_open_value
- ,'1' AS c_processtype
- FROM hscrm_dbo.speakforrelation a
- WHERE --a.l_create_date <= v_l_date
- --a.l_create_date <= 20101026
- --and
- a.l_product_no < 20000
- --and a.l_create_date <= 20101024
- --and (a.vc_customer_no = v_vc_customer or v_vc_customer = ' ')
- --and a.l_product_no=11003
- GROUP BY vc_customer_no,l_product_no,l_de_begin_date,l_de_end_date
- )
- LOOP
- v_vc_prefix := substr(r.vc_customer_no,1,3);
- if v_vc_prefix = 'CRM' then
- v_vc_customer_no := substr(r.vc_customer_no,4);
- v_vc_open_value_temp := r.vc_open_value;
- vc_product_temp := substr(to_char(r.l_product_no),1,1);
- if vc_product_temp = '1' then
- v_l_total := v_l_total + 1;
- vc_product_no := substr(to_char(r.l_product_no),2);
- SELECT COUNT(*) INTO v_l_count FROM hscrm_dbo.smsserviceparam WHERE vc_smsno = to_char(r.l_product_no);
- CASE
- WHEN v_l_count = 0 THEN
- v_vc_open_value := '';
- WHEN v_l_count = 1 THEN
- v_vc_open_value := REPLACE(r.vc_open_value,v_vc_temp1);
- WHEN v_l_count = 2 THEN
- v_vc_open_value := REPLACE(r.vc_open_value,v_vc_temp2);
- WHEN v_l_count = 3 THEN
- v_vc_open_value := REPLACE(r.vc_open_value,v_vc_temp3);
- WHEN v_l_count = 4 THEN
- v_vc_open_value := REPLACE(r.vc_open_value,v_vc_temp4);
- --zhoudy 20130131
- ELSE
- v_vc_open_value := REPLACE(r.vc_open_value,v_vc_temp4);
- END CASE;
- v_vc_open_value := REGEXP_REPLACE(v_vc_open_value,' ');
- v_vc_open_value := REPLACE(v_vc_open_value,',',chr(1));
- --V_L_SPEAK_NO := r.L_SPEAK_NO;
- INSERT INTO THJZX_DZGX_IN_HIS2(KHH,CPBH,DZLY,DZSJ,DQSJ,DZLX,CS,CJRQ)
- VALUES(v_vc_customer_no
- ,vc_product_no
- ,r.c_sourcetype
- ,r.l_de_begin_date
- ,r.l_de_end_date
- ,r.c_processtype
- ,v_vc_open_value
- ,v_l_date);
- end if;
- end if;
- COMMIT;
- END LOOP;
- commit;
- l_tyLog.up_Leave('sp_message_hisorderdata_create處理結束,成功生成數'||v_l_total);
- exception
- when others then
- rollback;
- l_tyLog.up_Error('sp_message_orderdata_create error:'||v_vc_customer_no||':'||V_L_SPEAK_NO||':'||v_l_date||':'||vc_product_no||':'|| v_vc_open_value||':'||SQLCODE);
- end sp_message_hisorderdata_create;
片斷解析: spa
初始化log的定義,其實如今type的內部; 日誌
- l_tyLog ty_logManager := ty_logManager('system','003');
調用log具體子過程 code
- l_tyLog.up_Error('sp_message_orderdata_create error:'||v_vc_customer_no||':'||V_L_SPEAK_NO||':'||v_l_date||':'||vc_product_no||':'|| v_vc_open_value||':'||SQLCODE);
- l_tyLog.up_Leave('sp_message_hisorderdata_create處理結束,成功生成數'||v_l_total);
二、TYPE定義 對象
上面初始化時調用的TY_LOGMANAGER是TYPE構造函數是的,整個TYPE的定義以下,注意其中的Member成員定義。 接口
- CREATE OR REPLACE TYPE "TY_LOGMANAGER" AS OBJECT
- (
- /*
- * $Header: $
- *
- *
- * Overview: 日誌管理器,封裝LOG,規範化LOG的輸出
- 實現了「多個Session的區別、性能問題定位、錯誤堆棧信息」,
- 設有LogLevel開關
- *
- * NOTES: NULL
- *--系統支持的LOG基本設置
- *C_LOG_DEBUG CONSTANT NUMBER(1) := 1;
- *C_LOG_INFO CONSTANT NUMBER(1) := 2;
- *C_LOG_WARN CONSTANT NUMBER(1) := 3;
- *C_LOG_ERROR CONSTANT NUMBER(1) := 4;
- *--當前系統LOG的設置
- *C_CURR_LOG_LEVEL CONSTANT NUMBER(1) := C_LOG_DEBUG;
- *C_CURR_PER_LEVEL CONSTANT NUMBER(10) := 1000; --單位(百分之一秒)除以100即爲秒數
- */
- ---成員屬性
- -- 對象生成的時間
- C_CURR_LOG_LEVEL NUMBER,
- C_CURR_PER_LEVEL NUMBER,
- m_nStartTime NUMBER,
- m_nSessionID CHAR(20),
- m_varTerminal VARCHAR2(16),
- m_varBusinessCode CHAR(100),
- m_chOperator CHAR(20),
- ---成員函數
- -- 構造函數
- CONSTRUCTOR FUNCTION ty_logManager
- (
- i_Operator IN CHAR DEFAULT NULL,
- i_varBusinessCode IN VARCHAR2 DEFAULT NULL
- ) RETURN SELF AS RESULT,
- -- 函數入口輸出重要信息
- MEMBER PROCEDURE up_Enter(i_varMsg IN VARCHAR2 DEFAULT NULL),
- -- 正常調用SP結束
- MEMBER PROCEDURE up_Leave(i_varMsg IN VARCHAR2 DEFAULT NULL),
- -- 輸出up_Debug信息到日誌表
- MEMBER PROCEDURE up_Debug(i_LogDesc IN VARCHAR2),
- -- 輸出up_Info信息到日誌表
- MEMBER PROCEDURE up_Info(i_LogDesc IN VARCHAR2),
- -- 輸出up_Warning信息到日誌表
- MEMBER PROCEDURE up_Warning(i_LogDesc IN VARCHAR2),
- -- 輸出up_Error信息到日誌表
- MEMBER PROCEDURE up_Error(i_LogDesc IN VARCHAR2),
- -- 往T_LOG中插入記錄
- MEMBER PROCEDURE up_InsertLog
- (
- i_LOGID IN NUMBER,
- i_LOGDATE IN CHAR,
- i_LOGTIME IN CHAR,
- i_LogLevel IN CHAR,
- i_ELAPSETIME IN NUMBER,
- i_SESSIONID IN CHAR,
- i_TERMINAL IN CHAR,
- i_Operator IN CHAR,
- i_LOGDESC IN VARCHAR2
- )
- )
三、TYPE BOBY定義 terminal
上面的TYPE體中定義了各個級別的Log處理Member子過程,其具體實現則在TYPE BODY中進行,源碼以下:
注意其實現中的公用過程的定義。
- CREATE OR REPLACE TYPE BODY ty_logManager IS
- /*************************************************************************
- 【函數功能】構造LOG對象,記錄開始此對象生成的開始時間,並記錄日誌
- 【使用狀況】構造函數,對象定義時自動調用
- 【參數說明】i_varBusinessCode IN VARCHAR2,通常傳入調用的SP程序名或者業務對應的代號
- 【異常處理】出錯時,處理全部異常,不拋出異常
- *************************************************************************/
- CONSTRUCTOR FUNCTION ty_logManager
- (
- i_Operator IN CHAR DEFAULT NULL,
- i_varBusinessCode IN VARCHAR2 DEFAULT NULL
- ) RETURN SELF AS RESULT IS
- BEGIN
- m_nStartTime := dbms_utility.get_time;
- m_nSessionID := userenv('sessionid');
- m_varTerminal := userenv('terminal');
- m_varBusinessCode := i_varBusinessCode;
- m_chOperator := i_Operator;
- RETURN;
- EXCEPTION
- WHEN OTHERS THEN
- NULL;
- END;
- /*************************************************************************
- 【函數功能】 調用SP接口的入口,記錄重要參數信息
- 【注意事項】通常在SP結束時調用
- 【參數說明】i_SPName IN VARCHAR2,通常傳入調用的SP程序名
- 【異常處理】出錯時,處理全部異常,不拋出異常
- *************************************************************************/
- MEMBER PROCEDURE up_Enter(i_varMsg IN VARCHAR2 DEFAULT NULL) IS
- BEGIN
- up_Info(i_varMsg || ',Enter.');
- EXCEPTION
- WHEN OTHERS THEN
- NULL;
- END;
- /*************************************************************************
- 【函數功能】正常調用SP結束,記錄時間統計信息
- 【異常處理】出錯時,處理全部異常,不拋出異常
- *************************************************************************/
- MEMBER PROCEDURE up_Leave(i_varMsg IN VARCHAR2 DEFAULT NULL) IS
- BEGIN
- up_Info(i_varMsg || ',Leave.');
- EXCEPTION
- WHEN OTHERS THEN
- NULL;
- END;
- /*************************************************************************
- 【函數功能】輸出up_Debug信息到日誌表 T_LOG
- 【注意事項】注意參數的長度和數據庫一致
- 【異常處理】出錯時,處理全部異常,不拋出異常。
- *************************************************************************/
- MEMBER PROCEDURE up_Debug(i_LogDesc IN VARCHAR2) IS
- PRAGMA AUTONOMOUS_TRANSACTION;
- l_date CHAR(8);
- l_time CHAR(8);
- l_LogID NUMBER(10);
- BEGIN
- SELECT to_char(SYSDATE, 'yyyymmdd'),
- to_char(SYSDATE, 'hh24miss'),
- seq_syslog.NEXTVAL
- INTO l_date, l_time, l_LogID
- FROM dual;
- up_InsertLog(l_LogID,
- l_date,
- l_time,
- '1',--Debug
- (dbms_utility.get_time - m_nStartTime),
- m_nSessionID,
- m_varTerminal,
- m_chOperator,
- i_LOGDESC);
- COMMIT;
- EXCEPTION
- WHEN OTHERS THEN
- ROLLBACK;
- END;
- /*************************************************************************
- 【函數功能】輸出up_Info信息到日誌表 T_LOG
- 【注意事項】注意參數的長度和數據庫一致
- 【異常處理】出錯時,處理全部異常,不拋出異常
- *************************************************************************/
- MEMBER PROCEDURE up_Info(i_LogDesc IN VARCHAR2) IS
- PRAGMA AUTONOMOUS_TRANSACTION;
- l_date CHAR(8);
- l_time CHAR(8);
- l_LogID NUMBER(10);
- BEGIN
- SELECT to_char(SYSDATE, 'yyyymmdd'),
- to_char(SYSDATE, 'hh24miss'),
- seq_syslog.NEXTVAL
- INTO l_date, l_time, l_LogID
- FROM dual;
- up_InsertLog(l_LogID,
- l_date,
- l_time,
- '2',--Info
- (dbms_utility.get_time - m_nStartTime),
- m_nSessionID,
- m_varTerminal,
- m_chOperator,
- i_LOGDESC);
- COMMIT;
- EXCEPTION
- WHEN OTHERS THEN
- ROLLBACK;
- END;
- /*************************************************************************
- 【函數功能】輸出up_Warning信息到日誌表 T_LOG
- 【注意事項】注意參數的長度和數據庫一致
- 【異常處理】出錯時,處理全部異常,不拋出異常
- *************************************************************************/
- MEMBER PROCEDURE up_Warning(i_LogDesc IN VARCHAR2) IS
- PRAGMA AUTONOMOUS_TRANSACTION;
- l_date CHAR(8);
- l_time CHAR(8);
- l_LogID NUMBER(10);
- BEGIN
- SELECT to_char(SYSDATE, 'yyyymmdd'),
- to_char(SYSDATE, 'hh24miss'),
- seq_syslog.NEXTVAL
- INTO l_date, l_time, l_LogID
- FROM dual;
- up_InsertLog(l_LogID,
- l_date,
- l_time,
- '3',--Warn
- (dbms_utility.get_time - m_nStartTime),
- m_nSessionID,
- m_varTerminal,
- m_chOperator,
- i_LOGDESC);
- COMMIT;
- EXCEPTION
- WHEN OTHERS THEN
- ROLLBACK;
- END;
- /*************************************************************************
- 【函數功能】輸出up_Error信息到日誌表 T_LOG
- 【注意事項】注意參數的長度和數據庫一致
- 【異常處理】出錯時,處理全部異常,不拋出異常
- *************************************************************************/
- MEMBER PROCEDURE up_Error(i_LogDesc IN VARCHAR2) IS
- PRAGMA AUTONOMOUS_TRANSACTION;
- l_date CHAR(8);
- l_time CHAR(8);
- l_LogID NUMBER(10);
- BEGIN
- SELECT to_char(SYSDATE, 'yyyymmdd'),
- to_char(SYSDATE, 'hh24miss'),
- seq_syslog.NEXTVAL
- INTO l_date, l_time, l_LogID
- FROM dual;
- up_InsertLog(l_LogID,
- l_date,
- l_time,
- '4',--Error
- (dbms_utility.get_time - m_nStartTime),
- m_nSessionID,
- m_varTerminal,
- m_chOperator,
- i_LOGDESC || CHR(10) ||
- DBMS_UTILITY.FORMAT_Error_BACKTRACE);
- COMMIT;
- EXCEPTION
- WHEN OTHERS THEN
- ROLLBACK;
- END;
- /*************************************************************************
- 【函數功能】往日誌表T_LOG中插入一條記錄
- 【使用狀況】建議外部不要直接調用
- 【異常處理】出錯時,不處理任何異常
- *************************************************************************/
- MEMBER PROCEDURE up_InsertLog
- (
- i_LOGID IN NUMBER,
- i_LOGDATE IN CHAR,
- i_LOGTIME IN CHAR,
- i_LogLevel IN CHAR,
- i_ELAPSETIME IN NUMBER,
- i_SESSIONID IN CHAR,
- i_TERMINAL IN CHAR,
- i_Operator IN CHAR,
- i_LOGDESC IN VARCHAR2
- ) IS
- BEGIN
- C_CURR_LOG_LEVEL := to_number(sp_message_sysparameters_get(0,5029));--1
- C_CURR_PER_LEVEL := to_number(sp_message_sysparameters_get(0,5030));--1000
- IF C_CURR_LOG_LEVEL <= i_LogLevel
- OR C_CURR_PER_LEVEL <= i_ELAPSETIME THEN
- INSERT INTO syslog
- (l_serial_no
- ,l_date
- ,l_time
- ,c_loglevel
- ,l_elapsetime
- ,vc_sessionid
- ,vc_terminal
- ,vc_businesscode
- ,vc_operator_no
- ,vc_logdesc)
- VALUES
- (i_LOGID,
- i_LOGDATE,
- i_LOGTIME,
- i_LogLevel,
- i_ELAPSETIME,
- i_SESSIONID,
- i_TERMINAL,
- m_varBUSINESSCODE,
- i_Operator,
- i_LOGDESC);
- END IF;
- END;
- END;
四、日誌截圖展現
可見上面初始化時候的類型爲「system」,vc_logdesc字段則記錄了咱們在調用地方記錄日誌的文本提示信息,如操做的記錄id、產品id、以及報錯信息、ora0000等的方便咱們排查的信息。
文章小結
由上面能夠看到經過層層封裝,最終咱們的日誌信息是寫入了syslog表進行了統一管理,並經過TYPE定義了各個級別的日誌寫入柄對外提供各個級別日誌的信息寫入。