日本語PDF

A DBMS_JOBのサポート

DBMS_JOBパッケージは引き続きサポートされます。ただし、DBMS_JOBジョブを発行するデータベース・スキーマにCREATE JOB権限を付与する必要があります。

Oracle Schedulerは、DBMS_JOBパッケージを置換します。DBMS_JOBは下位互換性のために引き続きサポートされますが、DBMS_JOBからOracle Schedulerに切り替えることをお薦めします。

Oracle Database 19c以降のリリースでは、アップグレードでDBMS_SCHEDULERを使用して既存のDBMS_JOBジョブを再作成できる場合、下位互換性のために、アップグレード後も引き続きDBMS_JOBDBMS_SCHEDULERジョブに対するレガシー・インタフェースとして機能します。メタデータの問題のため、DBMS_SCHEDULERを使用して既存のジョブを再作成できない場合は、アップグレードの事前チェックを実行した際にJOB_TABLE_INTEGRITY警告が表示されます。その場合、次の3つのオプションがあります。

  • メタデータを修正します。アップグレード後も引き続きDBMS_JOBSをインタフェースとして使用して実行し、DBMS_SCHEDULERジョブとして実行します。
  • 不要な場合は、ジョブを削除します。
  • DBMS_JOBSジョブを削除し、DBMS_SCHEDULERを使用して手動でジョブを再作成します。

アップグレード時に再作成されるDBMS_JOBで作成された既存のジョブの場合、DBMS_JOBレガシー・ジョブは引き続きインタフェースとして存在しますが、これを使用すると常にDBMS_SCHEDULERエントリが作成されます。インタフェースは別として、ジョブはDBMS_SCHEDULERジョブとして実行されます。その後、アップグレード前に作成されたDBMS_JOBジョブを無効にすると、DBMS_SCHEDULERジョブも無効になります。この動作を回避するには、レガシー・ジョブを削除し、DBMS_SCHEDULERジョブで置換します。

すべての新しいジョブには、DBMS_SCHEDULERを使用します。

A.1 DBMS_JOBからOracle Schedulerへの置換え

Oracle Database 11g リリース2 (11.2)以降では、DBMS_JOBがOracle Schedulerに置き換えられています。Oracle Schedulerは、ジョブのスケジュールに使用されるパッケージであるDBMS_JOBよりも、強力で柔軟性があります。DBMS_JOBは下位互換性のために引き続きサポートされますが、DBMS_JOBからOracle Schedulerに切り替えることをお薦めします。

A.1.1 DBMS_JOBの構成

JOB_QUEUE_PROCESSES初期化パラメータには、ジョブの実行に対して作成可能なプロセスの最大数を指定する。

Oracle Database 12cリリース2以降では、JOB_QUEUE_PROCESSESのデフォルトが4000になっています。ジョブ・コーディネータ・プロセスは、実行されるジョブ数と使用可能なリソースに基づいて、必要な数のジョブ・キュー・プロセスのみを起動します。JOB_QUEUE_PROCESSESにより低い数字を設定すると、ジョブ・キュー・プロセスの数を制限できます。

JOB_QUEUE_PROCESSESを0に設定すると、DBMS_JOBジョブおよびDBMS_SCHEDULERジョブが使用不可になります。

関連項目:

JOB_QUEUE_PROCESSES初期化パラメータの詳細は、『Oracle Databaseリファレンス』を参照してください。

A.1.2 DBMS_JOBとOracle Schedulerの使用

DBMS_JOBとOracle Scheduler(スケジューラ)は、同じジョブ・コーディネータを使用して、ジョブ・スレーブを起動します。

JOB_QUEUE_PROCESSES初期化パラメータを使用すると、DBMS_JOBとスケジューラの両方のジョブ・スレーブ数を制限できます。

JOB_QUEUE_PROCESSESが0の場合、DBMS_JOBとOracle Schedulerジョブの両方が無効になります。

A.2 DBMS_JOBからOracle Schedulerへの移行

この項では、DBMS_JOBパッケージで作成されたジョブを取得し、DBMS_SCHEDULERパッケージを構成して制御するOracle Schedulerを使用してそれらをリライトする方法の例をいくつか示します。

A.2.1 ジョブの作成

DBMS_JOBパッケージおよびDBMS_SCHEDULERパッケージを使用したジョブの作成を例で示します。

次の例では、DBMS_JOBを使用してジョブを作成します。

VARIABLE jobno NUMBER;
BEGIN
 DBMS_JOB.SUBMIT(:jobno, 'INSERT INTO employees VALUES (7935, ''SALLY'',
   ''DOGAN'', ''sally.dogan@examplecorp.com'', NULL, SYSDATE, ''AD_PRES'', NULL, 
    NULL, NULL, NULL);', SYSDATE, 'SYSDATE+1');
 COMMIT;
END;
/

DBMS_SCHEDULERを使用した等価の文は、次のとおりです。

BEGIN
 DBMS_SCHEDULER.CREATE_JOB(
   job_name          =>  'job1',
   job_type          =>  'PLSQL_BLOCK',
   job_action        =>  'INSERT INTO employees VALUES (7935, ''SALLY'',
     ''DOGAN'', ''sally.dogan@examplecorp.com'', NULL, SYSDATE,''AD_PRES'', NULL,
      NULL, NULL, NULL);',
   start_date        =>  SYSDATE,
   repeat_interval   =>  'FREQ = DAILY; INTERVAL = 1');
END;
/

A.2.2 ジョブの変更

DBMS_JOBパッケージおよびDBMS_SCHEDULERパッケージを使用したジョブの変更を例で示します。

次の例では、DBMS_JOBを使用してジョブを変更します。

BEGIN
 DBMS_JOB.WHAT(31, 'INSERT INTO employees VALUES (7935, ''TOM'', ''DOGAN'', 
   ''tom.dogan@examplecorp.com'', NULL, SYSDATE,''AD_PRES'', NULL,
   NULL, NULL, NULL);');
 COMMIT;
END;
/

この文では、別の値を挿入するようにJOB1の処理が変更されます。

DBMS_SCHEDULERを使用した等価の文は、次のとおりです。

BEGIN
 DBMS_SCHEDULER.SET_ATTRIBUTE(
   name          => 'JOB1',
   attribute     => 'job_action',
   value         => 'INSERT INTO employees VALUES (7935, ''TOM'', ''DOGAN'', 
      ''tom.dogan@examplecorp.com'', NULL, SYSDATE, ''AD_PRES'', NULL,
      NULL, NULL, NULL);');
END;
/

A.2.3 ジョブ・キューからのジョブの削除

DBMS_JOBパッケージおよびDBMS_SCHEDULERパッケージを使用したジョブの削除を例で示します。

次の例では、DBMS_JOBを使用してジョブを削除します。14144は実行されているジョブの番号です。

BEGIN
   DBMS_JOB.REMOVE(14144);
COMMIT;
END;
/

DBMS_SCHEDULERを使用して、かわりに次のような文を発行します。

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