Database

[Oracle]ジョブをスケジューリングして定期実行する方法

oracle Database
スポンサーリンク

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;
タイトルとURLをコピーしました