DBMS_JOBパッケージは、ジョブ・キュー内のジョブをスケジュールおよび管理します。
|
注意: DBMS_JOBパッケージは、DBMS_SCHEDULERパッケージによって置き換えられています。特に、システム・ロードを管理するジョブを管理する場合、ユーザーのパッケージの実行権限を取り消して、DBMS_JOBを無効にすることを考慮する必要があります。
詳細は、第140章「DBMS_SCHEDULER」および |
この章では、次の項目について説明します。
セキュリティ・モデル
使用上の注意
DBMS_JOBを使用するために必要な特定のシステム権限はありません。DBMS_JOBの管理に使用できるシステム権限はありません。ユーザー所有のジョブを除き、ジョブの変更や削除はできません。これは、DBA権限が付与されているユーザーを含むすべてのユーザーにあてはまります。
ユーザーによって所有されているか、またはそれに対する明示的なEXECUTE権限がユーザーに付与されているプロシージャを実行できます。ただし、ロールによってユーザーに実行権限が付与されているプロシージャを実行することはできません。
一度ジョブを起動して実行すると、そのジョブを簡単に停止する方法はありませんので注意してください。
DBMS_JOBはジョブの複数インスタンスの実行をサポートしています。デフォルトで、ジョブはどのインスタンスでも実行できますが、ジョブを実行するインスタンスは1つに限られます。さらに、ジョブを特定のインスタンスにバインドすることで、強制的にインスタンスをバインドできます。インスタンスのバインドを実装するには、インスタンス親和性パラメータにインスタンス番号を指定します。ただし、Oracle Database 10g リリース1(10.1)では、インスタンスのバインドは実装しないことをお薦めします。サービス親和性の方が適切です。この概念は、DBMS_SCHEDULERパッケージに実装されています。
次のプロシージャを使用して、インスタンス親和性のあるジョブを作成、変更または実行できます。親和性を指定しない場合、すべてのインスタンスでジョブが実行されることになるので注意してください。
ジョブをジョブ・キューに送るには、次の構文を使用します。
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にデフォルト設定されます。forceパラメータがTRUEの場合は、ジョブ・インスタンスとして正の整数がすべて受け入れられます。forceがFALSEの場合は、指定したインスタンスが実行されている必要があり、実行されていない場合は、エラー番号ORA-23428が表示されます。
ジョブを実行するために特定のインスタンスを割り当てるには、次の構文を使用します。
DBMS_JOB.INSTANCE( JOB IN BINARY_INTEGER,
instance IN BINARY_INTEGER,
force IN BOOLEAN DEFAULT FALSE);
この例のforceパラメータは、falseにデフォルト設定されます。インスタンスの値が0 (ゼロ)の場合は、ジョブ親和性が変更され、forceの値に関係なく使用可能なすべてのインスタンスがジョブを実行できます。INSTANCEの値が整数でFORCEパラメータがFALSEの場合、ジョブ親和性は、指定したインスタンスが実行されている場合のみ変更され、実行されていない場合は、エラーORA-23428が表示されます。
forceパラメータがTRUEの場合は、ジョブ・インスタンスとして正の整数がすべて受け入れられ、ジョブ親和性が変更されます。instanceの値が負数またはNULLの場合は、エラーORA-23319が表示されます。
ジョブに関連付けられたユーザー定義可能なパラメータを変更するには、次の構文を使用します。
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が表示されます。
表84-1 DBMS_JOBパッケージのサブプログラム
| サブプログラム | 説明 |
|---|---|
|
|
ジョブの実行を禁止します。 |
|
|
ジョブに関連付けられたユーザー定義可能なパラメータをすべて変更します。 |
|
|
インスタンスでジョブが実行されるように割り当てます。 |
|
|
指定したジョブの実行間隔を変更します。 |
|
|
指定したジョブの次の実行時間を変更します。 |
|
|
指定したジョブをジョブ・キューから削除します。 |
|
|
指定したジョブを強制的に実行します。 |
|
|
新規ジョブをジョブ・キューに送ります。 |
|
|
指定されたジョブをエクスポート用に再作成するか、またはインスタンス親和性を指定してエクスポート用に再作成します。 |
|
|
指定したジョブに関するジョブの記述を変更します。 |
このプロシージャは中断フラグを設定します。中断状態のジョブが実行されることはありません。
このプロシージャは、ユーザーがジョブに設定できるフィールドを変更します。
構文
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);
パラメータ
表84-3 CHANGEプロシージャのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
実行するジョブのシステム割当てID。このIDを調べるには、 |
|
|
実行するPL/SQLプロシージャ。 |
|
|
ジョブを次回実行する日付。 |
|
|
日付ファンクション。ジョブ実行の直前に評価されます。 |
|
|
ジョブの送信時にそのジョブを実行できるインスタンスを指定します。デフォルトは |
|
|
|
このプロシージャは、ジョブ・インスタンス親和性を変更します。
構文
DBMS_JOB.INSTANCE ( job IN BINARY_INTEGER, instance IN BINARY_INTEGER, force IN BOOLEAN DEFAULT FALSE);
このプロシージャは、ジョブの実行間隔を変更します。
使用上の注意
ジョブが正常に完了すると、next_dateにこの新しい日付が設定されます。intervalは、その日付をselect interval into next_date from dual;という文にはめ込むことによって評価されます。
intervalパラメータの評価結果は将来の日時に設定する必要があります。有効な間隔の例は次のとおりです。
| 間隔 | 説明 |
|---|---|
'sysdate + 7' |
毎週1回実行 |
'next_day(sysdate,''TUESDAY'')' |
毎週火曜日に実行 |
'null' |
1回のみ実行 |
intervalの評価結果がNULLで、ジョブが正常に完了した場合、そのジョブはキューから自動的に削除されます。
コミットされるまで、ジョブはバックグラウンドのジョブ・キューによって処理できるようになりません。
このプロシージャは、ジョブJOBをすぐに実行します。そのジョブが中断されている場合でも実行します。
ジョブが実行されると、next_dateが再計算されます。データ・ディクショナリ・ビューUSER_JOBS、またはDBA_JOBSを参照してください。
このプロシージャは、新規ジョブを送信します。順序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);
パラメータ
表84-9 SUBMITプロシージャのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
実行するジョブのシステム割当てID。このIDを調べるには、 |
|
|
実行するジョブのPL/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; 文に |
|
|
ジョブを次回実行する日付。 |
|
|
ジョブを次回実行する時間を計算する日付ファンクション。デフォルトは |
|
|
フラグ。デフォルトは たとえば、ジョブに関連付けられている表を作成する前にそのジョブを送信する場合は、この値を |
|
|
ジョブの送信時にそのジョブを実行できるインスタンスを指定します。 |
|
|
|
使用上の注意
コミットされるまで、ジョブはバックグラウンドのジョブ・キューによって処理できるようになりません。
パラメータ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
2種類のオーバーロードされたプロシージャがあります。最初のプロシージャは、指定したジョブを再作成するコールのテキストを生成します。2番目のプロシージャはインスタンス親和性を変更し(8i以上)、互換性を保ちます。