定期的に処理を実行できる DBMS_SCHEDULER

メモ:  Category:oracle

Oracle Database 11g リリース 2 (11.2)で、 DBMS_JOB が DBMS_SCHEDULER に置き換えられていますので、そろそろ移行したいなと考えております。

※移行を推奨されているだけで、 DBMS_JOB は使用可能です。

そこで、 DBMS_SCHEDULER の使い方につて見ていきます。

DBMS_SCHEDULER

linux の cron や Windows のタスクスケジュールのようにスケジューリングして定期的に処理を実行させる機能が Oracle にも用意されています。

Oracle 11g 以前では、 DBMS_JOB でしたがリリース 2 以降では DBMS_SCHEDULER も用意されました。

必要な権限

DBMS_SCHEDULER でジョブを作成するには、「CREATE JOB」権限が必要になります。上位の権限もありますが、自分のスキーマ内にジョブを作成するのであれば、「CREATE JOB」権限を付与します。

GRANT CREATE JOB TO scott

ジョブの設定例

例えば、1 日 1 回 「RECORD_SALES」というプロシージャーを実行したい場合は、次のようにジョブを作成します。

BEGIN

DBMS_SCHEDULER.CREATE_JOB
(
  job_name           =>  'JOB_SALES',
  job_type           =>  'STORED_PROCEDURE',
  job_action         =>  'RECORD_SALES',
  start_date         =>  TO_DATE('2023/09/30 23:00:00','yyyy/mm/dd hh24:mi:ss'),
  repeat_interval    =>  'FREQ=DAILY;INTERVAL=2',
  enabled            =>  TRUE
);

END;

上記例の場合、引数は次のようになります。

「job_name」には、登録するジョブの名称を指定します。

ここでは、ストアドプロシージャとして用意したものを呼び出したいので「job_type」には、「STORED_PROCEDURE」を指定しています。

それ以外には、次の指定があります。

実行タイプ(指定値) 呼び出し先
PLSQL_BLOCK PL/SQL ブロック;job_action に無名 PL/SQL ブロックを書きます
STORED_PROCEDURE ストアドプロシージャ名
EXECUTABLE OS のコマンドラインから実行可能な外部プログラム
CHAIN ジョブがチェーンであることを示します
BACKUP_SCRIPT RMAN バックアップ・スクリプト

「job_action」には、「job_type」で指定した種類のプログラムやスクリプトなどを指定します。

「start_date」には、ジョブを開始する日時を指定します。

「repeat_interval」には、ジョブを繰り返す間隔をカレンダ式または PL/SQL 式で指定します。指定がない場合は、指定した開始日に 1 回のみ実行されます。

「enabled」は、ジョブ作成時のジョブの状態を設定します。デフォルトは、 FALSE が設定されておりジョブ作成時は使用不可で作成されます。 TRUE に設定するとジョブが使用可能状態で作成されます。

これ以外にも次のようなパラーメータを設定することができます。

パラメータ名 説明
end_date ジョブを終了する日時を指定します。 end_date に値が指定されていない場合、無期限で繰り返されます。
job_class ジョブに関連付けるクラス。
auto_drop TRUE に設定すると、ジョブが完了するか自動的に使用禁止になると削除されます。
number_of_arguments 引数の数を指定します。
comments ジョブのコメントを指定します。

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=8 8 時間ごと
FREQ=MINUTELY 1 分ごと
FREQ=MINUTELY;INTERVAL=10 10 分ごと
FREQ=SECONDLY 1 秒ごと
FREQ=SECONDLY;INTERVAL=10 10 秒ごと

これ以外にも様々なパラメータを組み合わせて実行間隔を指定することができます。

ジョブの有効化、無効化

ジョブを有効にするには、 ENABLE プロシージャを使用しジョブ名を指定します。

BEGIN
    DBMS_SCHEDULER.ENABLE('JOB_SALES');
END;
/

ジョブを無効にするには、DISABLE プロシージャを使用しジョブ名を指定します。

BEGIN
    DBMS_SCHEDULER.DISABLE('JOB_SALES');
END;
/

ジョブの停止

実行中のジョブを停止するには、 STOP_JOB プロシージャを使用しジョブ名を指定します。

1 回かぎりのジョブの場合、状態は STOPPED に設定され、繰返しジョブの場合は、 SCHEDULED に設定されます。

BEGIN
    DBMS_SCHEDULER.STOP_JOB('JOB_SALES');
END;
/

ジョブの削除

ジョブを削除するには、 DROP_JOB プロシージャを使用しジョブ名を指定します。

BEGIN
    DBMS_SCHEDULER.DROP_JOB('JOB_SALES');
END;
/

ジョブの確認

ジョブを確認するには、 USER_SCHEDULER_JOBS や ALL_SCHEDULER_JOBS を参照します。

SELECT * FROM USER_SCHEDULER_JOBS;

bluenote by BBB