88 DBMS_JOB

DBMS_JOBパッケージは、ジョブ・キュー内のジョブをスケジュールおよび管理します。

ノート:

DBMS_JOBパッケージはDBMS_SCHEDULERパッケージによって置き換えられており、Oracle Databaseの今後のリリースではDBMS_JOBのサポートは削除される可能性があります。特に、システム・ロードを管理するジョブを管理する場合、ユーザーのパッケージの実行権限を取り消して、DBMS_JOBを無効にすることが推奨されます。

詳細は、「DBMS_SCHEDULER」および『Oracle Database管理者ガイド』DBMS_JOBからDBMS_SCHEDULERへの移行に関する項を参照してください。

この章のトピックは、次のとおりです:

88.1 DBMS_JOBのセキュリティ・モデル

DBMS_JOBを使用するために必要な特定のシステム権限はありません。DBMS_JOBの管理に使用できるシステム権限はありません。ユーザー所有のジョブを除き、ジョブの変更や削除はできません。これは、DBA権限が付与されているユーザーを含むすべてのユーザーにあてはまります。

ユーザーによって所有されているか、またはそれに対する明示的なEXECUTE権限がユーザーに付与されているプロシージャを実行できます。ただし、ロールによってユーザーに実行権限が付与されているプロシージャを実行することはできません。

一度ジョブを起動して実行すると、そのジョブを簡単に停止する方法はありませんので注意してください。

88.2 DBMS_JOBの操作上のノート

これらのノートは、ジョブの停止、およびOracle Real Application Clustersの操作について説明しています。

ジョブの停止

一度ジョブを起動して実行すると、そのジョブを簡単に停止する方法はありませんので注意してください。

Oracle Real Application Clustersの操作

DBMS_JOBはジョブの複数インスタンスの実行をサポートしています。デフォルトで、ジョブはどのインスタンスでも実行できますが、ジョブを実行するインスタンスは1つに限られます。さらに、ジョブを特定のインスタンスにバインドすることで、強制的にインスタンスをバインドできます。インスタンスのバインドを実装するには、インスタンス親和性パラメータにインスタンス番号を指定します。ただし、Oracle Database 10g リリース1(10.1)では、インスタンスのバインドは実装しないことをお薦めします。サービス親和性の方が適切です。この概念は、 DBMS_SCHEDULERパッケージに実装されています。

次のプロシージャを使用して、インスタンス親和性のあるジョブを作成、変更または実行できます。親和性を指定しない場合、すべてのインスタンスでジョブが実行されることになるので注意してください。

  • DBMS_JOB.SUBMIT

  • DBMS_JOB.INSTANCE

  • DBMS_JOB.CHANGE

  • DBMS_JOB.RUN

DBMS_JOB.SUBMIT

ジョブをジョブ・キューに送るには、次の構文を使用します。

DBMS_JOB.SUBMIT( 
   job       OUT    BINARY_INTEGER,
   what      IN     VARCHAR2, 
   next_date IN     DATE DEFAULT SYSDATE, 
   interval  IN     VARCHAR2 DEFAULT 'NULL',
   no_parse  IN     BOOLEAN DEFAULT FALSE,
   instance  IN     BINARY_INTEGER DEFAULT ANY_INSTANCE,
   force     IN     BOOLEAN DEFAULT FALSE);

パラメータinstanceおよびforceを使用して、ジョブおよびインスタンスの親和性を制御します。instanceのデフォルト値は0(ゼロ)で、いずれのインスタンスでもジョブを実行できることを示します。特定のインスタンスでジョブを実行するには、instanceの値を指定します。instanceの値が負数またはNULLの場合は、エラーORA-23319が表示されます。

forceパラメータのデフォルトはfalseです。forceTRUEの場合は、ジョブ・インスタンスとして正の整数を使用できます。forceFALSEの場合は、指定したインスタンスが実行されている必要があり、実行されていない場合は、エラー番号ORA-23428が表示されます。

DBMS_JOB.INSTANCE

ジョブを実行するために特定のインスタンスを割り当てるには、次の構文を使用します。

   DBMS_JOB.INSTANCE(  JOB IN BINARY_INTEGER,
     instance                IN BINARY_INTEGER, 
     force                   IN BOOLEAN DEFAULT FALSE);

この例のFORCEパラメータは、デフォルトでFALSEに設定されます。instanceの値が0(ゼロ)の場合は、forceの値に関係なく、ジョブ親和性が変更され、使用可能なすべてのインスタンスでジョブを実行できます。INSTANCEの値が整数でFORCEパラメータがFALSEの場合、ジョブ親和性は、指定したインスタンスが実行されている場合のみ変更され、実行されていない場合は、エラーORA-23428が表示されます。

forceパラメータがTRUEの場合は、ジョブ・インスタンスとして正の整数がすべて受け入れられ、ジョブ親和性が変更されます。instanceの値が負数またはNULLの場合は、エラーORA-23319が表示されます。

DBMS_JOB.CHANGE

ジョブに関連付けられたユーザー定義可能なパラメータを変更するには、次の構文を使用します。

   DBMS_JOB.CHANGE(  JOB IN BINARY_INTEGER,
   what                  IN VARCHAR2 DEFAULT NULL,
   next_date             IN DATE DEFAULT NULL,
   interval              IN VARCHAR2 DEFAULT NULL,
   instance              IN BINARY_INTEGER DEFAULT NULL,
   force                 IN BOOLEAN DEFAULT FALSE );

この例では、instanceおよびforceの2つのパラメータが使用されています。instanceのデフォルト値はNULLで、ジョブ親和性を変更しないことを示しています。

forceのデフォルト値はFALSEです。指定したインスタンスが実行されていない場合はエラーORA-23428が、instanceの数値が負数の場合はエラーORA-23319が表示されます。

DBMS_JOB.RUN

DBMS_JOB.RUNforceパラメータはFALSEにデフォルト設定されます。forceTRUEの場合は、フォアグラウンド・プロセスでのジョブ実行にインスタンス親和性は無関係です。forceがFALSEの場合は、指定したインスタンスでのみフォアグラウンドでジョブを実行できます。forceがFALSEで、接続されたインスタンスが不適切なインスタンスである場合は、エラーORA-23428が表示されます。

   DBMS_JOB.RUN( 
      job    IN BINARY_INTEGER,
      force  IN BOOLEAN DEFAULT FALSE);

88.3 DBMS_JOBサブプログラムの要約

この表は、DBMS_JOBサブプログラムを示し、簡単に説明しています。

表88-1 DBMS_JOBパッケージのサブプログラム

サブプログラム 説明

BROKENプロシージャ

ジョブの実行を禁止します。

CHANGEプロシージャ

ジョブに関連付けられたユーザー定義可能なパラメータをすべて変更します。

INSTANCEプロシージャ

インスタンスでジョブが実行されるように割り当てます。

INTERVALプロシージャ

指定したジョブの実行間隔を変更します。

NEXT_DATEプロシージャ

指定したジョブの次の実行時間を変更します。

REMOVEプロシージャ

指定したジョブをジョブ・キューから削除します。

RUNプロシージャ

指定したジョブを強制的に実行します。

SUBMITプロシージャ

新規ジョブをジョブ・キューに送ります。

USER_EXPORTプロシージャ

指定されたジョブをエクスポート用に再作成するか、またはインスタンス親和性を指定してエクスポート用に再作成します。

WHATプロシージャ

指定したジョブに関するジョブの記述を変更します。

88.3.1 BROKENプロシージャ

このプロシージャは中断フラグを設定します。中断状態のジョブが実行されることはありません。

構文

DBMS_JOB.BROKEN ( 
   job       IN  BINARY_INTEGER,
   broken    IN  BOOLEAN,
   next_date IN  DATE DEFAULT SYSDATE);

パラメータ

表88-2 BROKENプロシージャのパラメータ

パラメータ 説明

job

実行するジョブのシステム割当てID。このIDを調べるには、USER_JOBSビューまたはDBA_JOBSビューのJOB列を問い合わせてください。

broken

ジョブを中断または中断なしに設定します。TRUEは中断に設定し、FALSEは中断なしに設定します。

next_date

ジョブを次回実行する日付。

ノート:

実行中のジョブに中断を指定すると、ジョブの完了後、ジョブのステータスはNORMALにリセットされます。したがって、このプロシージャは、実行中でないジョブに対してのみ実行してください。

使用上のノート

  • コミットされるまで、ジョブはバックグラウンドのジョブ・キューによって処理できるようになりません。

  • ジョブが16回失敗すると、自動的にそのジョブが中断に設定され、ジョブの実行は試行されなくなります。

88.3.2 CHANGEプロシージャ

このプロシージャは、ユーザーがジョブに設定できるフィールドを変更します。

構文

DBMS_JOB.CHANGE ( 
   job       IN  BINARY_INTEGER,
   what      IN  VARCHAR2,
   next_date IN  DATE,
   interval  IN  VARCHAR2,
   instance  IN  BINARY_INTEGER DEFAULT NULL,
   force     IN  BOOLEAN DEFAULT FALSE);

パラメータ

表88-3 CHANGEプロシージャのパラメータ

パラメータ 説明

job

実行するジョブのシステム割当てID。このIDを調べるには、USER_JOBSビューまたはDBA_JOBSビューのJOB列を問い合わせてください。

what

実行するPL/SQLプロシージャ。

next_date

ジョブを次回実行する日付。

interval

日付ファンクション。ジョブ実行の直前に評価されます。

instance

ジョブの送信時にそのジョブを実行できるインスタンスを指定します。デフォルトはNULLで、インスタンス親和性が変更されないことを示します。

force

FALSEの場合、(インスタンス番号を変更する対象に)指定したインスタンスが実行している必要があります。そうでない場合は、ルーチンに例外が発生します。

TRUEの場合は、ジョブ・インスタンスとして正の整数がすべて受け入れられます。

使用上のノート

  • コミットされるまで、ジョブはバックグラウンドのジョブ・キューによって処理できるようになりません。

  • パラメータinstanceおよびforceがジョブ・キュー親和性のために追加されています。ジョブ・キュー親和性を使用して、ユーザーは、送信されたジョブを特定のインスタンスで実行するか、またはどのインスタンスでも実行できるようにするかを指示できます。

  • パラメータwhatnext_dateまたはintervalNULLの場合、現在の値は変更されません。

BEGIN
   DBMS_JOB.CHANGE(14144, null, null, 'sysdate+3');
   COMMIT;
END; 

88.3.3 INSTANCEプロシージャ

このプロシージャは、ジョブ・インスタンス親和性を変更します。

構文

DBMS_JOB.INSTANCE ( 
   job        IN BINARY_INTEGER,
   instance   IN BINARY_INTEGER,
   force      IN BOOLEAN DEFAULT FALSE);

パラメータ

表88-4 INSTANCEプロシージャのパラメータ

パラメータ 説明

job

実行するジョブのシステム割当てID。このIDを調べるには、USER_JOBSビューまたはDBA_JOBSビューのJOB列を問い合わせてください。

instance

ジョブの送信時に、ユーザーはジョブを実行できるインスタンスを指定できます。

force

TRUEの場合は、ジョブ・インスタンスとして正の整数がすべて受け入れられます。FALSE(デフォルト)の場合は、指定したインスタンスが実行している必要があり、そうでない場合は、ルーチンに例外が発生します。

使用上のノート

コミットされるまで、ジョブはバックグラウンドのジョブ・キューによって処理できるようになりません。

88.3.4 INTERVALプロシージャ

このプロシージャは、ジョブの実行間隔を変更します。

構文

DBMS_JOB.INTERVAL ( 
   job       IN  BINARY_INTEGER,
   interval  IN  VARCHAR2);

パラメータ

表88-5 INTERVALプロシージャのパラメータ

パラメータ 説明

job

実行するジョブのシステム割当てID。このIDを調べるには、USER_JOBSビューまたはDBA_JOBSビューのJOB列を問い合わせてください。

interval

日付ファンクション。ジョブの実行直前に評価されます。

使用上のノート

  • ジョブが正常に完了すると、next_dateにこの新しい日付が設定されます。intervalは、その日付をselect interval into next_date from dual;という文にはめ込むことによって評価されます。

  • intervalパラメータの評価結果は将来の日時に設定する必要があります。有効な間隔の例は次のとおりです。

    間隔 説明

    'sysdate + 7'

    毎週1回実行

    'next_day(sysdate,''TUESDAY'')'

    毎週火曜日に実行

    null

    1回のみ実行。

  • intervalの評価結果がNULLで、ジョブが正常に完了した場合、そのジョブはキューから自動的に削除されます。

  • コミットされるまで、ジョブはバックグラウンドのジョブ・キューによって処理できるようになりません。

88.3.5 NEXT_DATEプロシージャ

このプロシージャは、既存のジョブの次回実行時間を変更します。

構文

DBMS_JOB.NEXT_DATE ( 
   job       IN  BINARY_INTEGER,
   next_date IN  DATE);

パラメータ

表88-6 NEXT_DATEプロシージャのパラメータ

パラメータ 説明

job

実行するジョブのシステム割当てID。このIDを調べるには、USER_JOBSビューまたはDBA_JOBSビューのJOB列を問い合わせてください。

next_date

次回のリフレッシュ日付。この日付になるとジョブは自動的に実行されます。ただし、ジョブを実行するバックグラウンド・プロセスが存在することが前提です。

使用上のノート

コミットされるまで、ジョブはバックグラウンドのジョブ・キューによって処理できるようになりません。

88.3.6 REMOVEプロシージャ

このプロシージャは、ジョブ・キューから既存のジョブを削除します。実行中のジョブを停止する機能は、現在はありません。

構文

DBMS_JOB.REMOVE ( 
   job       IN  BINARY_INTEGER );

パラメータ

表88-7 REMOVEプロシージャのパラメータ

パラメータ 説明

job

実行するジョブのシステム割当てID。このIDを調べるには、USER_JOBSビューまたはDBA_JOBSビューのJOB列を問い合わせてください。

使用上のノート

コミットされるまで、ジョブはバックグラウンドのジョブ・キューによって処理できるようになりません。

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

88.3.7 RUNプロシージャ

このプロシージャは、ジョブJOBをすぐに実行します。そのジョブが中断されている場合でも実行します。

ジョブが実行されると、next_dateが再計算されます。データ・ディクショナリ・ビューUSER_JOBS、またはDBA_JOBSを参照してください。

構文

DBMS_JOB.RUN ( 
   job       IN  BINARY_INTEGER,
   force     IN  BOOLEAN DEFAULT FALSE);

パラメータ

表88-8 RUNプロシージャのパラメータ

パラメータ 説明

job

実行するジョブのシステム割当てID。このIDを調べるには、USER_JOBSビューまたはDBA_JOBSビューのJOB列を問い合わせてください。

force

TRUEの場合、フォアグラウンド・プロセスでのジョブの実行にインスタンス親和性は無関係です。FALSEの場合は、指定したインスタンスでのみフォアグラウンドでジョブを実行できます。

EXECUTE DBMS_JOB.RUN(14144);

警告:

これは、現行セッションのパッケージを再初期化します。

例外

forceFALSEで、接続インスタンスが正しくない場合は、例外が発生します。

88.3.8 SUBMITプロシージャ

このプロシージャは、新規ジョブを送信します。順序sys.jobseqからジョブを選択します。

構文

DBMS_JOB.SUBMIT ( 
   job       OUT BINARY_INTEGER,
   what      IN  VARCHAR2,
   next_date IN  DATE DEFAULT SYSDATE,
   interval  IN  VARCHAR2 DEFAULT 'null',
   no_parse  IN  BOOLEAN DEFAULT FALSE,
   instance  IN  BINARY_INTEGER DEFAULT any_instance,
   force     IN  BOOLEAN DEFAULT FALSE);

パラメータ

表88-9 SUBMITプロシージャのパラメータ

パラメータ 説明

job

実行するジョブのシステム割当てID。このIDを調べるには、USER_JOBSビューまたはDBA_JOBSビューのJOB列を問い合わせてください

what

実行するジョブのPL/SQLテキスト。これは有効なPL/SQL文、またはコードのブロックであることが必要です。たとえば、ストアド・プロシージャPを実行するには、文字列P; (セミコロンを含む)をこのルーチンに渡すことができます。whatパラメータで指定したSQLは、次に示すPL/SQLブロック内でラップされます。

DECLARE
 job BINARY_INTEGER := :job;
 next_date DATE := :mydate;
 broken BOOLEAN := FALSE;
BEGIN
 WHAT
 :mydate := next_date;
 IF broken THEN :b := 1; ELSE :b := 0; END IF;
END;

文に; セミコロンを含めたかどうか確認してください。

next_date

ジョブを次回実行する日付。

interval

ジョブを次回実行する時間を計算する日付ファンクション。デフォルトはNULLです。このファンクションは、将来の日時またはNULLに設定される必要があります。

no_parse

フラグ。デフォルトはFALSEです。FALSEに設定すると、ジョブに関連付けられているプロシージャが解析されます。TRUEに設定すると、ジョブに関連付けられているプロシージャがそのジョブの初回実行時に解析されます。

たとえば、ジョブに関連付けられている表を作成する前にそのジョブを送信する場合は、この値をTRUEに設定します。

instance

ジョブの送信時にそのジョブを実行できるインスタンスを指定します。

force

TRUEの場合は、ジョブ・インスタンスとして正の整数がすべて受け入れられます。FALSE(デフォルト)の場合は、指定したインスタンスが実行している必要があり、そうでない場合は、ルーチンに例外が発生します。

使用上のノート

  • コミットされるまで、ジョブはバックグラウンドのジョブ・キューによって処理できるようになりません。

  • パラメータinstanceおよびforceがジョブ・キュー親和性のために追加されています。ジョブ・キュー親和性を使用して、ユーザーは、送信されたジョブを特定のインスタンスで実行するか、またはどのインスタンスでも実行できるようにするかを指示できます。

新規ジョブをジョブ・キューに送る例です。このジョブは、プロシージャDBMS_DDL.ANALYZE_OBJECTをコールし、表DQUON.ACCOUNTSに関するオプティマイザの統計情報を生成します。統計情報は、ACCOUNTS表にある行の半分をサンプルとして使用します。このジョブは24時間ごとに実行されます。

VARIABLE jobno number;
BEGIN
   DBMS_JOB.SUBMIT(:jobno, 
      'dbms_ddl.analyze_object(''TABLE'',
      ''DQUON'', ''ACCOUNTS'', 
      ''ESTIMATE'', NULL, 50);' 
      SYSDATE, 'SYSDATE + 1');
   COMMIT;
END;
/
Statement processed.
print jobno
JOBNO
----------
14144

88.3.9 USER_EXPORTプロシージャ

2種類のオーバーロードされたプロシージャがあります。最初のプロシージャは、指定したジョブを再作成するコールのテキストを生成します。2番目のプロシージャはインスタンス親和性を変更し(8i以上)、互換性を保ちます。

構文

DBMS_JOB.USER_EXPORT ( 
   job    IN     BINARY_INTEGER,
   mycall IN OUT VARCHAR2);

DBMS_JOB.USER_EXPORT ( 
   job      IN     BINARY_INTEGER,
   mycall   IN OUT VARCHAR2,
   myinst   IN OUT VARCHAR2);

パラメータ

表88-10 USER_EXPORTプロシージャのパラメータ

パラメータ 説明

job

実行するジョブのシステム割当てID。このIDを調べるには、USER_JOBSビューまたはDBA_JOBSビューのJOB列を問い合わせてください。

mycall

指定したジョブを再作成するコールのテキスト。

myinst

インスタンス親和性を変更するコールのテキスト。

88.3.10 WHATプロシージャ

このプロシージャは、既存のジョブが実行する内容を変更し、その環境を置き換えます。

構文

DBMS_JOB.WHAT ( 
   job       IN  BINARY_INTEGER,
   what      IN  VARCHAR2);

パラメータ

表88-11 WHATプロシージャのパラメータ

パラメータ 説明

job

実行するジョブのシステム割当てID。このIDを調べるには、USER_JOBSビューまたはDBA_JOBSビューのJOB列を問い合わせてください。

what

実行するPL/SQLプロシージャ。

使用上のノート

  • コミットされるまで、ジョブはバックグラウンドのジョブ・キューによって処理できるようになりません。

  • 次に正しいwhatの値の例(ルーチンが存在していると仮定)を示します。

    • 'myproc(''10-JAN-82'', next_date, broken);'

    • 'scott.emppackage.give_raise(''JENKINS'', 30000.00);'

    • 'dbms_job.remove(job);'