誰可以幫忙寫個監控存盤程序的腳本,包括開始時間,結束時間,例外報錯
uj5u.com熱心網友回復:
這個要寫在存盤程序里的uj5u.com熱心網友回復:
誰呼叫的程序?說說具體場景和具體需求
uj5u.com熱心網友回復:
我們都是在程序中寫入日志的uj5u.com熱心網友回復:
CREATE OR REPLACE PROCEDURE PROC_SAVELOG(PROGRAM_NAME VARCHAR2,--程序名稱IS_SUCCEED VARCHAR2,--是否執行成功 Y|N
EXECUTE_MSG CLOB,--程序執行資訊
BEGIN_TIME TIMESTAMP--程序開始執行TIMESTAMP
) AS
V_PROGRAM_NAME VARCHAR2(1000) := SUBSTRB(PROGRAM_NAME, 1, 1000); --程序名稱
V_IS_SUCCEED CHAR(1) := SUBSTR(IS_SUCCEED, 1, 1); --程序執行成功表示 Y N
V_BEGIN_TIME TIMESTAMP := BEGIN_TIME;
PRAGMA AUTONOMOUS_TRANSACTION; --日志開啟自治事務,不影響業務邏輯事務
/*
呼叫方式:
1.正常日志:PROC_SAVELOG(V_PROC_NAME, 'Y', '執行成功。。。',V_BEGIN_TIME);
2.例外日志:PROC_SAVELOG(V_PROC_NAME, 'N', SQLERRM,V_BEGIN_TIME);
*/
BEGIN
INSERT INTO PROGRAM_EXECUTE_LOG
(PROGRAM_NAME,
IS_SUCCEED,
LOG_DATE,
EXECUTE_MSG, --已改為CLOB
TIME_CONSUMING,
EXECUTE_ORDER,
EXECUTE_BEGINTIME,
EXECUTE_ENDTIME)
VALUES
(V_PROGRAM_NAME,
V_IS_SUCCEED,
SYSDATE,
EXECUTE_MSG,
F_TIMESTAMP_DIFF(SYSTIMESTAMP, V_BEGIN_TIME),
PROGRAM_EXECUTE_LOG_SEQ.NEXTVAL,
V_BEGIN_TIME,
SYSTIMESTAMP);
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
END;
-- Create table
create table PROGRAM_EXECUTE_LOG
(
program_name VARCHAR2(1000),
is_succeed CHAR(1),
log_date DATE,
execute_msg CLOB,
time_consuming NUMBER,
execute_order NUMBER,
execute_begintime TIMESTAMP(6),
execute_endtime TIMESTAMP(6),
process_flag VARCHAR2(10) default 'N'
)
tablespace YZB_DATA01
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
next 1M
minextents 1
maxextents unlimited
);
-- Add comments to the table
comment on table PROGRAM_EXECUTE_LOG
is '程序、函式、觸發器執行性能日志';
-- Add comments to the columns
comment on column PROGRAM_EXECUTE_LOG.execute_order
is '流水號program_pfmc_log_seq';
comment on column PROGRAM_EXECUTE_LOG.process_flag
is '處理標識(已處理Y,未處理N)';
CREATE OR REPLACE PROCEDURE PROC_BG_CLEAR(ORG_CODE IN VARCHAR2,
TODAY IN DATE,
RESULT OUT VARCHAR2) AS
V_ORG_CODE VARCHAR2(10) := ORG_CODE;
V_TODAY DATE := TODAY;
V_SETP INT := 1;
V_CONF_NUM INT;
V_NOTCONF_NUM INT;
V_COUNT INT;
V_ERR_MSG VARCHAR2(1000);
V_BEGIN_TIME TIMESTAMP := SYSTIMESTAMP;
V_PROCESS_ERPS VARCHAR2(10);
V_CB_UPDATE_TO_0 VARCHAR2(10) := 'N';
V_PROC_NAME VARCHAR2(1000) := 'PROC_BG_CLEAR/' || V_ORG_CODE || '/' ||
TO_CHAR(V_TODAY, 'YYYY-MM-DD HH24:MI:SS');
V_EXE_MSG CLOB;
/*清空報工資料[email protected]*/
BEGIN
RESULT:='OK';
DBMS_LOB.CREATETEMPORARY(V_EXE_MSG, TRUE); --初始化CLOB
SELECT NVL(sum(decode(t.CONFIRM, 'Y', 1, 0)), 0),
NVL(sum(decode(t.CONFIRM, 'Y', 0, 1)), 0),
COUNT(1)
INTO V_CONF_NUM, V_NOTCONF_NUM, V_COUNT
FROM P_BG_WORK T
where T.PRODUCT_DATE = V_TODAY
AND T.ORG_CODE = V_ORG_CODE;
IF V_COUNT = 0 THEN
V_ERR_MSG := to_char(V_TODAY, 'yyyy-mm-dd') || '未找到可洗掉資料!';
goto PROCESS_ERRMSG;
elsif V_CONF_NUM > 0 then
V_ERR_MSG := to_char(V_TODAY, 'yyyy-mm-dd') || '已經確認,無法洗掉!';
goto PROCESS_ERRMSG;
end if;
DELETE FROM P_BG_WORK T
where T.PRODUCT_DATE = V_TODAY
AND T.ORG_CODE = V_ORG_CODE
AND T.CONFIRM = 'N';
--日志處理
PROC_SAVELOG(V_PROC_NAME, 'Y', V_EXE_MSG, V_BEGIN_TIME);
RETURN;
--例外處理
<<PROCESS_ERRMSG>>
PROC_PROCESS_ERRMSG(V_PROC_NAME, V_EXE_MSG, V_ERR_MSG, V_BEGIN_TIME, RESULT);
EXCEPTION
WHEN OTHERS THEN
V_ERR_MSG := SUBSTR(SQLERRM, 1, 160);
DBMS_LOB.APPEND(V_EXE_MSG, V_ERR_MSG);
PROC_SAVELOG(V_PROC_NAME, 'N', V_EXE_MSG, V_BEGIN_TIME);
RESULT := V_ERR_MSG; --錯誤號對應的資訊
END;
uj5u.com熱心網友回復:
自己在程序中記錄日志,上面是個例子轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/102141.html
標籤:開發
