定期的に処理を実行できる DBMS_SCHEDULER
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;