Oracle DBMS SCHEDULEの使用


💡 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;