Oracle DBMS SCHEDULEの使用
18813 ワード
💡 DBMS_SCHEDULER
Windowsのタスクスケジューラ、LinuxのCRONDのように、Oracleにもスケジューラがあります
Oracleドキュメント:DBMS SCHEDULE
📝 スケジューラクエリ
--스케줄러 조회
SELECT
JOB_NAME, REPEAT_INTERVAL
, TO_CHAR(LAST_START_DATE, 'YYYY-MM-DD HH24:MI:SS')
, TO_CHAR(NEXT_RUN_DATE, 'YYYY-MM-DD HH24:MI:SS')
FROM USER_SCHEDULER_JOBS
--WHERE LOGGING_LEVEL = 'RUNS'
ORDER BY REPEAT_INTERVAL
--스케줄러 로그 조회
SELECT *
FROM USER_SCHEDULER_JOB_LOG
WHERE JOB_NAME='JOB_SP_CUST_INAC_SMS'
📝 スケジューラの作成
BEGIN
DBMS_SCHEDULER.CREATE_JOB
(
JOB_NAME => 'JOB_SP_CUST_INAC_SMS',
JOB_TYPE => 'PLSQL_BLOCK',
JOB_CLASS => 'DEFAULT_JOB_CLASS',
START_DATE => TO_TIMESTAMP_TZ('2022/03/22 12:00:00.000000 +09:00'
,'YYYY/MM/DD HH24:MI:SS.FF TZR'),
JOB_ACTION =>
'
/* ---------------------------------------------
* [고객휴면문자] SP_CUST_INAC_SMS
* 실행 SP : SP_CUST_INAC_SMS
* 주기 : 매일 03시 00분 생성
*
*/
DECLARE
OUT_CODE VARCHAR2(256) ; -- 처리결과코드 (0:Success, -1:Fail)
OUT_MSG VARCHAR2(4096); -- 처리메세지
BEGIN
-- 회사코드를 가져온다...
DECLARE CURSOR COMP_DATA IS
SELECT COMP_CD, COMP_KOR_NM
FROM CFCOMP
WHERE COMP_CLOSE_DT IS NULL
AND COMP_CD = ''NG001''
ORDER BY BUSI_DT;
BEGIN
FOR CUR_COMP_DATA IN COMP_DATA LOOP
BEGIN
SP_CUST_INAC_SMS
(CUR_COMP_DATA.COMP_CD, ''SYSTEM'', ''SYSTEM'', OUT_CODE, OUT_MSG);
END;
END LOOP;
END;
END;
',
REPEAT_INTERVAL => 'FREQ=DAILY;BYHOUR=03;BYMINUTE=00;BYSECOND=00',
COMMENTS => '휴면예정 고객안내 문자'
);
END;
📝 オプション
--스케줄러 사용
EXEC SYS.DBMS_SCHEDULER.ENABLE
(NAME => 'JOB_SP_CUST_INAC_SMS');
--오류 발생 시 재시작 여부 기본값: FALSE
EXEC SYS.DBMS_SCHEDULER.SET_ATTRIBUTE
( NAME => 'JOB_SP_CUST_INAC_SMS'
,ATTRIBUTE => 'RESTARTABLE'
,VALUE => FALSE);
--우선순위 1~5 1이 가장 먼저, 기본: 3
EXEC SYS.DBMS_SCHEDULER.SET_ATTRIBUTE
( NAME => 'JOB_SP_CUST_INAC_SMS'
,ATTRIBUTE => 'JOB_PRIORITY'
,VALUE => 3);
--완료 및 미사용 시 자동 삭제여부
EXEC SYS.DBMS_SCHEDULER.SET_ATTRIBUTE
( NAME => 'JOB_SP_CUST_INAC_SMS'
,ATTRIBUTE => 'AUTO_DROP'
,VALUE => FALSE);
💡 ログの使用
DBMS_SCHEDULER.LOGGING OFF:ログx
DBMS_SCHEDULER.LOGGING FAILED RUNS:記録のみ失敗
DBMS_SCHEDULER.LOGGING RUNS:すべての実行ログ(デフォルト)
DBMS_SCHEDULER.LOGGING FULL:すべての実行とタスクで実行されたすべてのタスクを記録する
(作成、アクティブ化、変更、停止など)
EXEC SYS.DBMS_SCHEDULER.SET_ATTRIBUTE
( NAME => 'JOB_SP_CUST_INAC_SMS'
,ATTRIBUTE => 'LOGGING_LEVEL'
,VALUE => SYS.DBMS_SCHEDULER.LOGGING_RUNS);
📝 実行と削除
--실행
EXEC DBMS_SCHEDULER.RUN_JOB
('JOB_SP_CUST_INAC_SMS');
--삭제
BEGIN
DBMS_SCHEDULER.DROP_JOB
(
JOB_NAME =>'JOB_SP_CUST_INAC_SMS123',
FORCE => FALSE
);
END;
ソースコードの統合
--스케줄러 확인
SELECT
JOB_NAME, REPEAT_INTERVAL
, TO_CHAR(LAST_START_DATE, 'YYYY-MM-DD HH24:MI:SS')
, TO_CHAR(NEXT_RUN_DATE, 'YYYY-MM-DD HH24:MI:SS')
FROM USER_SCHEDULER_JOBS
--WHERE LOGGING_LEVEL = 'RUNS'
ORDER BY REPEAT_INTERVAL
--스케줄러 로그 확인
SELECT *
FROM USER_SCHEDULER_JOB_LOG
WHERE JOB_NAME='JOB_SP_CUST_INAC_SMS'
--스케줄러 생성
BEGIN
DBMS_SCHEDULER.CREATE_JOB
(
JOB_NAME => 'JOB_SP_CUST_INAC_SMS',
JOB_TYPE => 'PLSQL_BLOCK',
JOB_CLASS => 'DEFAULT_JOB_CLASS',
START_DATE => TO_TIMESTAMP_TZ('2021/03/24 12:00:00.000000 +09:00'
,'YYYY/MM/DD HH24:MI:SS.FF TZR'),
JOB_ACTION =>
'
/* ---------------------------------------------
* [고객휴면문자] SP_CUST_INAC_SMS
* 실행 SP : SP_CUST_INAC_SMS
* 주기 : 매일 03시 00분 생성
*
*/
DECLARE
OUT_CODE VARCHAR2(256) ; -- 처리결과코드 (0:Success, -1:Fail)
OUT_MSG VARCHAR2(4096); -- 처리메세지
BEGIN
-- 회사코드를 가져온다...
DECLARE CURSOR COMP_DATA IS
SELECT COMP_CD, COMP_KOR_NM
FROM CFCOMP
WHERE COMP_CLOSE_DT IS NULL
AND COMP_CD = ''NG001''
ORDER BY BUSI_DT;
BEGIN
FOR CUR_COMP_DATA IN COMP_DATA LOOP
BEGIN
SP_CUST_INAC_SMS
(CUR_COMP_DATA.COMP_CD, ''SYSTEM'', ''SYSTEM'', OUT_CODE, OUT_MSG);
END;
END LOOP;
END;
END;
',
REPEAT_INTERVAL => 'FREQ=DAILY;BYHOUR=03;BYMINUTE=00;BYSECOND=00',
COMMENTS => '휴면예정 고객안내 문자'
);
END;
--스케줄러 사용
EXEC SYS.DBMS_SCHEDULER.ENABLE
(NAME => 'JOB_SP_CUST_INAC_SMS');
--오류 발생 시 재시작 여부 기본값: false
EXEC SYS.DBMS_SCHEDULER.SET_ATTRIBUTE
( NAME => 'JOB_SP_CUST_INAC_SMS'
,ATTRIBUTE => 'RESTARTABLE'
,VALUE => FALSE);
--우선순위 1~5 1이 가장 먼저, 기본: 3
EXEC SYS.DBMS_SCHEDULER.SET_ATTRIBUTE
( NAME => 'JOB_SP_CUST_INAC_SMS'
,ATTRIBUTE => 'JOB_PRIORITY'
,VALUE => 3);
/*로그사용
DBMS_SCHEDULER.LOGGING_OFF : 로그 x
DBMS_SCHEDULER.LOGGING_FAILED_RUNS : 실패 건만 로그 기록
DBMS_SCHEDULER.LOGGING_RUNS : 모든 실행에 대한 로그 기록(기본)
DBMS_SCHEDULER.LOGGING_FULL : 모든 실행 및 작업에서 실행되는 모든 작업도 기록(생성, 활성화, 변경, 중지 등)
*/
EXEC SYS.DBMS_SCHEDULER.SET_ATTRIBUTE
( NAME => 'JOB_SP_CUST_INAC_SMS'
,ATTRIBUTE => 'LOGGING_LEVEL'
,VALUE => SYS.DBMS_SCHEDULER.LOGGING_RUNS);
--완료 및 미사용 시 자동 삭제여부
EXEC SYS.DBMS_SCHEDULER.SET_ATTRIBUTE
( NAME => 'JOB_SP_CUST_INAC_SMS'
,ATTRIBUTE => 'AUTO_DROP'
,VALUE => FALSE);
--실행
EXEC DBMS_SCHEDULER.RUN_JOB
('JOB_SP_CUST_INAC_SMS');
--삭제
BEGIN
DBMS_SCHEDULER.DROP_JOB
(
JOB_NAME =>'JOB_SP_CUST_INAC_SMS123',
FORCE => FALSE
);
END;
Reference
この問題について(Oracle DBMS SCHEDULEの使用), 我々は、より多くの情報をここで見つけました https://velog.io/@conda/oracleDbmsSchedulerテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol