92 DBMS_JOB
DBMS_JOB
パッケージは、ジョブ・キュー内のジョブをスケジュールおよび管理します。
ノート:
DBMS_JOB
パッケージはDBMS_SCHEDULER
パッケージによって置き換えられており、Oracle Databaseの今後のリリースではDBMS_JOB
のサポートは削除される可能性があります。特に、システム・ロードを管理するジョブを管理する場合、ユーザーのパッケージの実行権限を取り消して、DBMS_JOB
を無効にすることが推奨されます。
詳細は、「DBMS_SCHEDULER」および『Oracle Database管理者ガイド』のDBMS_JOB
からDBMS_SCHEDULER
への移行に関する項を参照してください。
この章のトピックは、次のとおりです:
92.1 DBMS_JOBのセキュリティ・モデル
DBMS_JOB
は、DBMS_SCHEDULER
と同じセキュリティ・ポリシーを使用します。DBMS_JOB
を使用するにはCREATE JOB
権限が必要です。
ユーザー所有のジョブを除き、ジョブの変更や削除はできません。これは、DBA権限が付与されているユーザーを含むすべてのユーザーにあてはまります。
ユーザーが所有しているプロシージャを実行できます。プロシージャのEXECUTE
権限が明示的にそのユーザーに付与されている必要があります。ただし、ロールによってユーザーに実行権限が付与されているプロシージャを実行することはできません。
一度ジョブを起動して実行すると、そのジョブを簡単に停止する方法はありませんので注意してください。
92.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
にデフォルト設定されます。force
パラメータがTRUE
の場合は、ジョブ・インスタンスとして正の整数がすべて受け入れられます。force
がFALSE
の場合は、指定したインスタンスが実行されている必要があり、実行されていない場合は、エラー番号ORA-23428
が表示されます。
DBMS_JOB.INSTANCE
ジョブを実行するために特定のインスタンスを割り当てるには、次の構文を使用します。
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
ジョブに関連付けられたユーザー定義可能なパラメータを変更するには、次の構文を使用します。
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.RUN
のforce
パラメータはFALSE
にデフォルト設定されます。force
がTRUE
の場合は、フォアグラウンド・プロセスでのジョブ実行にインスタンス親和性は無関係です。forceがFALSE
の場合は、指定したインスタンスでのみフォアグラウンドでジョブを実行できます。forceがFALSE
で、接続されたインスタンスが不適切なインスタンスである場合は、エラーORA-23428
が表示されます。
DBMS_JOB.RUN( job IN BINARY_INTEGER, force IN BOOLEAN DEFAULT FALSE);
92.3 DBMS_JOBサブプログラムの要約
この表は、DBMS_JOB
サブプログラムを示し、簡単に説明しています。
表92-1 DBMS_JOBパッケージのサブプログラム
サブプログラム | 説明 |
---|---|
ジョブの実行を禁止します。 |
|
ジョブに関連付けられたユーザー定義可能なパラメータをすべて変更します。 |
|
インスタンスでジョブが実行されるように割り当てます。 |
|
指定したジョブの実行間隔を変更します。 |
|
指定したジョブの次の実行時間を変更します。 |
|
指定したジョブをジョブ・キューから削除します。 |
|
指定したジョブを強制的に実行します。 |
|
新規ジョブをジョブ・キューに送ります。 |
|
指定されたジョブをエクスポート用に再作成するか、またはインスタンス親和性を指定してエクスポート用に再作成します。 |
|
指定したジョブに関するジョブの記述を変更します。 |
92.3.1 BROKENプロシージャ
このプロシージャは中断フラグを設定します。中断状態のジョブが実行されることはありません。
構文
DBMS_JOB.BROKEN ( job IN BINARY_INTEGER, broken IN BOOLEAN, next_date IN DATE DEFAULT SYSDATE);
パラメータ
表92-2 BROKENプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
実行するジョブのシステム割当てID。このIDを調べるには、 |
|
ジョブを中断または中断なしに設定します。 |
|
ジョブを次回実行する日付。 |
ノート:
実行中のジョブに中断を指定すると、ジョブの完了後、ジョブのステータスはNORMALにリセットされます。したがって、このプロシージャは、実行中でないジョブに対してのみ実行してください。
使用上のノート
-
コミットされるまで、ジョブはバックグラウンドのジョブ・キューによって処理できるようになりません。
-
ジョブが16回失敗すると、自動的にそのジョブが中断に設定され、ジョブの実行は試行されなくなります。
92.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);
パラメータ
表92-3 CHANGEプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
実行するジョブのシステム割当てID。このIDを調べるには、 |
|
実行するPL/SQLプロシージャ。 |
|
ジョブを次回実行する日付。 |
|
日付ファンクション。ジョブ実行の直前に評価されます。 |
|
ジョブの送信時にそのジョブを実行できるインスタンスを指定します。デフォルトは |
|
|
使用上のノート
-
コミットされるまで、ジョブはバックグラウンドのジョブ・キューによって処理できるようになりません。
-
パラメータ
instance
およびforce
がジョブ・キュー親和性のために追加されています。ジョブ・キュー親和性を使用して、ユーザーは、送信されたジョブを特定のインスタンスで実行するか、またはどのインスタンスでも実行できるようにするかを指示できます。 -
パラメータ
what
、next_date
またはinterval
がNULL
の場合、現在の値は変更されません。
例
BEGIN DBMS_JOB.CHANGE(14144, null, null, 'sysdate+3'); COMMIT; END;
92.3.3 INSTANCEプロシージャ
このプロシージャは、ジョブ・インスタンス親和性を変更します。
構文
DBMS_JOB.INSTANCE ( job IN BINARY_INTEGER, instance IN BINARY_INTEGER, force IN BOOLEAN DEFAULT FALSE);
パラメータ
表92-4 INSTANCEプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
実行するジョブのシステム割当てID。このIDを調べるには、 |
|
ジョブの送信時に、ユーザーはジョブを実行できるインスタンスを指定できます。 |
|
|
使用上のノート
コミットされるまで、ジョブはバックグラウンドのジョブ・キューによって処理できるようになりません。
92.3.4 INTERVALプロシージャ
このプロシージャは、ジョブの実行間隔を変更します。
構文
DBMS_JOB.INTERVAL ( job IN BINARY_INTEGER, interval IN VARCHAR2);
パラメータ
表92-5 INTERVALプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
実行するジョブのシステム割当てID。このIDを調べるには、 |
|
日付ファンクション。ジョブの実行直前に評価されます。 |
使用上のノート
-
ジョブが正常に完了すると、
next_date
にこの新しい日付が設定されます。interval
は、その日付をselectinterval
intonext_date
from dual;という文にはめ込むことによって評価されます。 -
interval
パラメータの評価結果は将来の日時に設定する必要があります。有効な間隔の例は次のとおりです。間隔 説明 'sysdate + 7'
毎週1回実行
'next_day(sysdate,''TUESDAY'')'
毎週火曜日に実行
null
1回のみ実行。
-
interval
の評価結果がNULL
で、ジョブが正常に完了した場合、そのジョブはキューから自動的に削除されます。 -
コミットされるまで、ジョブはバックグラウンドのジョブ・キューによって処理できるようになりません。
92.3.5 NEXT_DATEプロシージャ
このプロシージャは、既存のジョブの次回実行時間を変更します。
構文
DBMS_JOB.NEXT_DATE ( job IN BINARY_INTEGER, next_date IN DATE);
パラメータ
表92-6 NEXT_DATEプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
実行するジョブのシステム割当てID。このIDを調べるには、 |
|
次回のリフレッシュ日付。この日付になるとジョブは自動的に実行されます。ただし、ジョブを実行するバックグラウンド・プロセスが存在することが前提です。 |
使用上のノート
コミットされるまで、ジョブはバックグラウンドのジョブ・キューによって処理できるようになりません。
92.3.6 REMOVEプロシージャ
このプロシージャは、ジョブ・キューから既存のジョブを削除します。実行中のジョブを停止する機能は、現在はありません。
構文
DBMS_JOB.REMOVE ( job IN BINARY_INTEGER );
パラメータ
表92-7 REMOVEプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
実行するジョブのシステム割当てID。このIDを調べるには、 |
使用上のノート
コミットされるまで、ジョブはバックグラウンドのジョブ・キューによって処理できるようになりません。
例
BEGIN DBMS_JOB.REMOVE(14144); COMMIT; END;
92.3.7 RUNプロシージャ
このプロシージャは、ジョブJOB
をすぐに実行します。そのジョブが中断されている場合でも実行します。
ジョブが実行されると、next_date
が再計算されます。データ・ディクショナリ・ビューUSER_JOBS
、またはDBA_JOBS
を参照してください。
構文
DBMS_JOB.RUN ( job IN BINARY_INTEGER, force IN BOOLEAN DEFAULT FALSE);
パラメータ
表92-8 RUNプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
実行するジョブのシステム割当てID。このIDを調べるには、 |
|
|
例
EXECUTE DBMS_JOB.RUN(14144);
警告:
これは、現行セッションのパッケージを再初期化します。
例外
force
がFALSE
で、接続インスタンスが正しくない場合は、例外が発生します。
92.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);
パラメータ
表92-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
92.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);
パラメータ
表92-10 USER_EXPORTプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
実行するジョブのシステム割当てID。このIDを調べるには、 |
|
指定したジョブを再作成するコールのテキスト。 |
|
インスタンス親和性を変更するコールのテキスト。 |
92.3.10 WHATプロシージャ
このプロシージャは、既存のジョブが実行する内容を変更し、その環境を置き換えます。
構文
DBMS_JOB.WHAT ( job IN BINARY_INTEGER, what IN VARCHAR2);
パラメータ
表92-11 WHATプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
実行するジョブのシステム割当てID。このIDを調べるには、 |
|
実行するPL/SQLプロシージャ。 |
使用上のノート
-
コミットされるまで、ジョブはバックグラウンドのジョブ・キューによって処理できるようになりません。
-
次に正しい
what
の値の例(ルーチンが存在していると仮定)を示します。-
'myproc(''10-JAN-82'', next_date, broken);'
-
'scott.emppackage.give_raise(''JENKINS'', 30000.00);'
-
'dbms_job.remove(job);'
-