DBMS_SCHEDULERパッケージを使用したジョブスケジューリング
Oracleでジョブを定期実行するには、DBMS_SCHEDULERパッケージやDBMS_JOBパッケージを使用してスケジューリングします。
DBMS_SCHEDULERパッケージはOracle10g以降から使用可能なパッケージで、DBMS_JOBパッケージよりも詳細なスケジューリング設定をすることができます。
また、DBMS_JOBパッケージで作成しているスケジュールは、DBMS_SCHEDULERパッケージへの移行が推奨されています。
DBMS_SCHEDULERパッケージでは、ジョブタイプに外部プログラムを指定することができ、バッチファイルやコマンドラインをOracleから起動することができます。
この記事ではDBMS_SCHEDULERパッケージを使用したジョブスケジュールの作成方法を記載します。
ジョブの作成
1つのジョブを作成する場合はCREATE_JOBプロシージャ、複数のジョブを作成する場合はCREATE_JOBSプロシージャでジョブを作成します。
新規ジョブとしてジョブ名をjob1、TEST_PROCストアドプロシージャを2015/01/01から2015/12/31まで1日おきに実行するジョブスケジュールを作成する場合。
BEGIN DBMS_SCHEDULER.CREATE_JOB ( job_name => 'job1', job_type => 'STORED_PROCEDURE', job_action => 'TEST_PROC', start_date => to_date('2015/01/01 00:00:00','yyyy/mm/dd hh24:mi:ss'), repeat_interval => 'FREQ=DAILY;INTERVAL=1', end_date => to_date('2015/12/31 00:00:00','yyyy/mm/dd hh24:mi:ss'), job_class => 'batch_update_jobs', auto_drop => FALSE, enabled => TRUE, comments => 'テストジョブ'); END; /
Windows上でDOSコマンドを実行する外部ジョブの作成する場合。
BEGIN DBMS_SCHEDULER.CREATE_JOB( job_name => 'MKDIR_JOB', job_type => 'EXECUTABLE', number_of_arguments => 3, job_action => '\windows\system32\cmd.exe', auto_drop => FALSE); DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE('mkdir_job',1,'/c'); DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE('mkdir_job',2,'mkdir'); DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE('mkdir_job',3,'\temp\extjob_test_dir'); DBMS_SCHEDULER.SET_ATTRIBUTE('MKDIR_JOB', 'credential_name', 'STEVE'); DBMS_SCHEDULER.ENABLE('MKDIR_JOB'); END; /
パラメータ概要
パラメータ名 | 説明 |
---|---|
job_name | ジョブを一意に識別できる名前を指定します。 |
job_type | 作成するジョブのタイプを指定します。 PLSQL_BLOCK - 無名PL/SQLブロック STORED_PROCEDURE - ストアドプロシージャ EXECUTABLE - OSのコマンドラインから実行可能な外部プログラム CHAIN - チェーン |
job_action | ジョブのアクションを指定します。 ジョブタイプがPLSQL_BLOCKの場合は、PL/SQLコードを指定します。 例.BEGIN my_proc(); END; ジョブタイプがSTORED_PROCEDUREの場合は、ストアドプロシージャ名を指定します。 ジョブタイプがEXECUTABLEの場合は、外部プログラム名を指定します。 例.コマンドプロンプトを実行 '\windows\system32\cmd.exe' ジョブタイプがCHAINの場合は、チェーンオブジェクト名を指定します。 |
start_date | ジョブを開始する日時を指定します。 |
repeat_interval | 繰り返す間隔を指定します。指定がない場合は、指定した開始日に1回のみ実行されます。 |
end_date | ジョブを終了する日時を指定します。end_dateに値が指定されていない場合、ジョブは無期限で繰り返されます。 |
job_class | ジョブに関連付けるクラス。 |
auto_drop | デフォルトはTRUEが設定されており、ジョブはスケジュールが全て完了するとジョブは自動で削除されます。 フラグをFALSEに設定すると削除されなくなります。 |
enabled | デフォルトはFALSEが設定されており、ジョブ作成時は使用不可で作成されます。 フラグをTRUEに設定するとジョブが使用可能状態で作成されます。 |
number_of_arguments | プログラムがインラインされている場合の引数の数。 |
comments | ジョブのコメントを指定します。 |
詳細は下記参照。
http://otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd/appdev.111/E05686-02/d_sched.htm
ジョブの有効化、無効化
ジョブを有効にするにはENABLEプロシージャを使用しジョブ名を指定します。
BEGIN DBMS_SCHEDULER.ENABLE('job1'); END; /
ジョブを無効にするにはDISABLEプロシージャを使用しジョブ名を指定します。
BEGIN DBMS_SCHEDULER.DISABLE('job1'); END; /
ジョブの停止
実行中のジョブを停止するにはSTOP_JOBプロシージャを使用しジョブ名を指定します。
1回かぎりのジョブの状態はSTOPPEDに設定され、繰返しジョブの状態は、(次回のジョブ実行がスケジュールされているため)SCHEDULEDに設定されます。
BEGIN DBMS_SCHEDULER.STOP_JOB('job1'); END; /
ジョブの削除
ジョブを削除するにはDROP_JOBプロシージャを使用しジョブ名を指定します。
BEGIN DBMS_SCHEDULER.DROP_JOB('job1'); END; /
ジョブの確認
現ユーザのジョブを確認するにはUSER_SCHEDULER_JOBSを参照します。
SELECT * FROM USER_SCHEDULER_JOBS;