Oracleのジョブでスケジュール実行する
Oracleのストアドを実行する際、定期的にスケジューリングして実行したい場合があります。Windowsのタスクスケジュールのように。
例えば、「毎週日曜の夜0時にAプロシージャを実行する」など。
これがジョブです。
夜間のバッチ処理や定期的な処理はジョブでスケジュール実行すると便利ですね。ジョブはOracleの「DBMS_SCHEDULER」パッケージを利用します。
ジョブの権限
Oracleの「DBMS_SCHEDULER」でジョブを作成するには「CREATE JOB」権限が必要です。「MANAGE SCHEDULER」もあった方がいいかもしれません。
あらかじめ権限を割り当ててください。
-- ジョブを作成する権限 GRANT CREATE JOB TO user1; GRANT MANAGE SCHEDULER TO user1;
DBMS_SCHEDULERの構文
スケジュール ジョブを実行する「DBMS_SCHEDULER」パッケージの構文はこちらです。
-- ジョブを実行する DBMS_SCHEDULER.CREATE_JOB ( job_name => ジョブの名前, job_type => ジョブタイプ(※下記参照), job_action => ストアド・プロシージャ名、もしくはPL/SQLコード, start_date => ジョブの開始日時, end_date => ジョブの終了日時, repeat_interval => ジョブの実行間隔(※下記参照), enabled => TRUE(有効) or FALSE(無効) );
job_type(ジョブタイプ)
PLSQL_BLOCK | PL/SQLコード |
STORED_PROCEDURE | ストアドプロシージャ |
EXECUTABLE | 外部プログラム |
CHAIN | チェーン |
実行するコードを直接ジョブに書くには「PLSQL_BLOCK」、事前にストアドプロシージャとして用意したものを呼び出すには「STORED_PROCEDURE」です。「STORED_PROCEDURE」にしておいた方が無難ですね。
repeat_interval(実行間隔)
FREQ=YEARLY | 1年ごと |
FREQ=MONTHLY | 1ケ月ごと |
FREQ=MONTHLY;INTERVAL=6 | 6ケ月ごと |
FREQ=DAILY | 1日ごと |
FREQ=DAILY;INTERVAL=7 | 7日ごと |
FREQ=HOURLY | 1時間ごと |
FREQ=HOURLY;INTERVAL=3 | 3時間ごと |
FREQ=MINUTELY | 1分ごと |
FREQ=MINUTELY;INTERVAL=10 | 10分ごと |
FREQ=SECONDLY | 1秒 |
FREQ=SECONDLY;INTERVAL=10 | 10秒ごと |
repeat_intervalではジョブの実行間隔を指定します。
その他のオプションでは「enabled」を省略すると「FALSE」となりジョブが指定した時刻になっても実行されないので注意してください。「TRUE」にしてください。
スケジュール ジョブの例
-- PROC_Aを1日毎に実行するジョブ1 BEGIN DBMS_SCHEDULER.CREATE_JOB ( job_name => 'JOB_PROC_A', job_type => 'STORED_PROCEDURE', job_action => 'USER1.PROC_A', start_date => TO_DATE('2018/08/01 00:00:00','yyyy/mm/dd hh24:mi:ss'), repeat_interval => 'FREQ=HOURLY', enabled => TRUE ); END;
ここでは、2018/8/1 0時から1時間ごとに「PROC_A」を実行するジョブ「JOB_PROC_A」を作りました。
終了時間は指定しませんでした。終了時間を指定しないとジョブは実行し続けます。
Oracleのジョブの注意点
ただしこのジョブ、1つ注意点があります。
上記の例は1時間間隔で実行していますが、処理が終わってからプラス1日です。よって処理時間がかかるジョブの場合、だんだん時間がズレていきます。
例えば、0時スタートのジョブがあります。今日、ジョブの実行に3分かかったしたら、翌日のジョブの実行開始時間は0時3分からとなります。
時間にシビアなケースでのジョブは使わない方がよいです。
参照:https://docs.oracle.com/cd/E16338_01/server.112/b56301/scheduse.htm
以上、Oracleでスケジュール実行するジョブを作成する方法でした。
コメント