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