Oracleでスケジュール実行するジョブを作成する

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でスケジュール実行するジョブを作成する方法でした。

 

コメント