ヘッダーをスキップ

Oracle Database 管理者ガイド
10gリリース2(10.2)

B19224-02
目次
目次
索引
索引

戻る 次へ

27 スケジューラの使用

Oracle Databaseには、Oracle Scheduler(スケジューラ)を使用したデータベース・ジョブ機能が用意されています。この章では、スケジューラの様々な構成要素の使用方法について説明します。この章の内容は、次のとおりです。

スケジューラ・オブジェクトとそのネーミング

各スケジューラ・オブジェクトは、[schema.]nameという形式の完全なデータベース・スキーマ・オブジェクトです。スケジューラ・オブジェクトは、データベース・オブジェクトのネーミング規則に厳密に従っています。また、他のデータベース・オブジェクトとSQLネームスペースを共有しています。

スケジューラ・オブジェクトの名前がDBMS_SCHEDULERパッケージで使用されるときも、SQLネーミング規則に従います。スケジューラ・オブジェクト名は、デフォルトでは大文字です。大文字にしない場合は二重引用符で囲みます。たとえば、ジョブの作成時には、job_name => 'my_job'は、job_name => 'My_Job'およびjob_name => 'MY_JOB'と同じですが、job_name => '"my_job"'とは同じではありません。DBMS_SCHEDULERパッケージ内でスケジューラ・オブジェクト名のカンマ区切りのリストが使用される場合も、これらのネーミング規則に従います。

オブジェクトの命名に関する詳細は、『Oracle Database SQLリファレンス』を参照してください。

ジョブの使用

ジョブは、スケジュールとプログラムの組合せで、他にプログラムに必要な引数が含まれます。この項では、ジョブの基本的なタスクについて説明します。この項の内容は、次のとおりです。

ジョブのタスクとそのプロシージャ

表27-1に、ジョブの一般的なタスクとそれに対応するプロシージャおよび権限を示します。

表 27-1    ジョブのタスクとそのプロシージャ 
タスク  プロシージャ  必要な権限 

ジョブの作成 

CREATE_JOB  

CREATE JOBまたはCREATE ANY JOB 

ジョブの変更 

SET_ATTRIBUTE  

ALTERまたはCREATE ANY JOB、あるいは所有者 

ジョブの実行 

RUN_JOB  

ALTERまたはCREATE ANY JOB、あるいは所有者 

ジョブのコピー 

COPY_JOB  

ALTERまたはCREATE ANY JOB、あるいは所有者 

ジョブの削除 

DROP_JOB  

ALTERまたはCREATE ANY JOB、あるいは所有者 

ジョブの停止 

STOP_JOB  

ALTERまたはCREATE ANY JOB、あるいは所有者 

ジョブの使用禁止 

DISABLE  

ALTERまたはCREATE ANY JOB、あるいは所有者 

ジョブの使用可能化 

ENABLE  

ALTERまたはCREATE ANY JOB、あるいは所有者 

権限に関する詳細は、「スケジューラ権限の管理方法」を参照してください。

ジョブの作成

ジョブを作成するには、CREATE_JOBプロシージャまたはEnterprise Managerを使用します。ジョブの作成時には、処理、スケジュールおよびその他の属性を指定します。たとえば、次の文では、update_salesというジョブが作成されます。このジョブは、売上集計表を更新する、OPSスキーマ内のストアド・プロシージャをコールします。

BEGIN
DBMS_SCHEDULER.CREATE_JOB (
   job_name           =>  'update_sales',
   job_type           =>  'STORED_PROCEDURE',
   job_action         =>  'OPS.SALES_PKG.UPDATE_SALES_SUMMARY',
   start_date         =>  '28-APR-03 07.00.00 PM Australia/Sydney',
   repeat_interval    =>  'FREQ=DAILY;INTERVAL=2', /* every other day */
   end_date           =>  '20-NOV-04 07.00.00 PM Australia/Sydney',
   job_class          =>  'batch_update_jobs',
   comments           =>  'My new job');
END;
/

schema.job_nameを指定すると、別のスキーマ内にジョブを作成できます。したがって、ジョブの作成者がジョブの所有者であるとはかぎりません。ジョブの所有者は、ジョブが作成されるスキーマを所有しているユーザーであり、ジョブの作成者はジョブを作成しているユーザーです。ジョブは、そのジョブが作成されるスキーマの権限で実行されます。実行時のジョブのNLS環境は、そのジョブが作成された時点に存在していた環境です。

作成したジョブは、*_SCHEDULER_JOBSビューを使用して問い合せることができます。ジョブはデフォルトでは使用禁止で作成されるため、実行するには使用可能にする必要があります。

ジョブは、デフォルトでは完了後に自動的に削除されるように設定されています。auto_drop属性をFALSEに設定すると、ジョブは保持されます。繰返しジョブは、ジョブ終了日をすぎるか、最大実行回数(max_runs)または最大失敗回数(max_failures)に達するまでは自動削除されないことに注意してください。

ジョブ属性の設定

ジョブ属性はジョブの作成時に設定するか、あるいは作成後にSET_ATTRIBUTEまたはEnterprise Managerを使用して設定できます(一部のジョブ属性は、SET_ATTRIBUTEプロシージャまたはEnterprise Managerでのみ設定できます)。

SET_ATTRIBUTEプロシージャおよび様々なジョブ属性の詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

ジョブ引数の設定

ジョブの作成後、次の場合にジョブ引数の設定が必要な場合があります。

ジョブ引数を設定するには、SET_JOB_ARGUMENT_VALUEまたはSET_JOB_ANYDATA_VALUEプロシージャ、あるいはEnterprise Managerを使用します。SET_JOB_ANYDATA_VALUEは、ANYDATAオブジェクト内にカプセル化する必要がある複雑なデータ型に使用されます。

引数を必要とする場合があるジョブの例の1つに、開始日と終了日が必要なレポート作成プログラムを開始するジョブがあります。次のコード例では、レポート作成プログラムの2番目の引数である終了日のジョブ引数が設定されます。

BEGIN
DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE (
   job_name                => 'ops_reports',
   argument_position       => 2,
   argument_value          => '12-DEC-03');
END;
/

値がすでに設定されている引数についてこのプロシージャを使用すると、その引数は上書きされます。引数値を設定するには、引数名または引数の位置を使用します。引数名を使用するには、ジョブが名前付きプログラム・オブジェクトを参照し、そのプログラム・オブジェクト内で引数に名前が割り当てられている必要があります。プログラムがインラインで記述されている場合にサポートされるのは、位置による設定のみです。引数は、タイプがplsql_blockのジョブに対してはサポートされません。

設定されている値を削除するには、RESET_JOB_ARGUMENTプロシージャを使用します。このプロシージャは、通常の引数およびANYDATA引数の両方に使用できます。

SET_JOB_ARGUMENT_VALUEおよびSET_JOB_ANYDATA_VALUEプロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

ジョブの作成方法

ジョブを作成するには、CREATE_JOBプロシージャまたはEnterprise Managerを使用します。このプロシージャはオーバーロードになるため、複数の使用方法があります。ジョブ作成時にジョブをインラインで記述することに加えて、名前付きプログラムとスケジュールを指し示すジョブを作成することもできます。この操作については、次の項を参照してください。

名前付きプログラムを使用したジョブの作成

ジョブの処理をインラインで記述するかわりに、名前付きプログラムを指し示してジョブを作成することもできます。名前付きプログラムを使用してジョブを作成するには、ジョブの作成時にCREATE_JOBプロシージャでprogram_nameの値を指定し、job_typejob_actionおよびnumber_of_argumentsの値は指定しません。

ジョブの作成時に既存のプログラムを使用するには、ジョブの所有者がプログラムの所有者であるか、またはそのプログラムに対するEXECUTE権限を持っている必要があります。次の文は、名前付きプログラムを指定したCREATE_JOBプロシージャの使用例です。この文では、my_new_job1というジョブが作成されます。

BEGIN
DBMS_SCHEDULER.CREATE_JOB (
   job_name          =>  'my_new_job1',
   program_name      =>  'my_saved_program', 
   repeat_interval   =>  'FREQ=DAILY;BYHOUR=12',
   comments          =>  'Daily at noon');
END;
/
名前付きスケジュールを使用したジョブの作成

ジョブのスケジュールをインラインで記述するかわりに、名前付きスケジュールを指し示してジョブを作成することもできます。名前付きスケジュールを使用してジョブを作成するには、ジョブの作成時にCREATE_JOBプロシージャでschedule_nameの値を指定し、start_daterepeat_intervalおよびend_dateの値は指定しません。

ジョブの作成にはすべての名前付きスケジュールを使用できます。これは、スケジュールはすべてPUBLICに対するアクセス権限付きで作成されているためです。次の文は、名前付きスケジュールを指定したCREATE_JOBプロシージャの使用例です。この文では、my_new_job2というジョブが作成されます。

BEGIN
DBMS_SCHEDULER.CREATE_JOB (
   job_name                 =>  'my_new_job2', 
   job_type                 =>  'PLSQL_BLOCK',
   job_action               =>  'BEGIN SALES_PKG.UPDATE_SALES_SUMMARY; END;',
   schedule_name            =>  'my_saved_schedule');
END;
/
名前付きプログラムとスケジュールを使用したジョブの作成

ジョブは、名前付きプログラムとスケジュールの両方を指し示して作成することもできます。次の文は、名前付きプログラムとスケジュールを指定したCREATE_JOBプロシージャの使用例です。この文では、既存のプログラムmy_saved_program1と既存のスケジュールmy_saved_schedule1に基づいて、my_new_job3という新規ジョブが作成されます。

BEGIN
DBMS_SCHEDULER.CREATE_JOB (
   job_name            =>  'my_new_job3', 
   program_name        =>  'my_saved_program1', 
   schedule_name       =>  'my_saved_schedule1');
END;
/

ジョブのコピー

ジョブをコピーするには、COPY_JOBプロシージャまたはEnterprise Managerを使用します。このプロシージャをコールすると、旧ジョブのすべての属性が新規ジョブにコピーされます。ただし、新規ジョブは使用禁止の状態で作成され、別の名前が設定されます。

COPY_JOBプロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

ジョブの変更

ジョブを変更するには、SET_ATTRIBUTEプロシージャまたはEnterprise Managerを使用します。ジョブはすべて変更できます。また、ジョブ名以外のすべてのジョブ属性を変更できます。SET_ATTRIBUTEのコール時に実行中のジョブ・インスタンスがあった場合、そのジョブはコールの影響を受けません。変更は、次回のジョブ実行時から反映されます。

通常、データベースによって自動的に作成されたジョブは変更しないでください。データベースによって作成されたジョブの場合、ジョブ・ビューでSYSTEM列がTRUEに設定されます。ジョブの属性は、*_SCHEDULER_JOBSビューで使用可能です。

実行中のジョブに対して独自のジョブ属性をSET_ATTRIBUTEプロシージャを使用して変更することは有効ですが、変更された属性は、スケジュールされた次回のジョブ実行時まで取り出されません。

SET_ATTRIBUTEプロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。また、「スケジューラの構成」を参照してください。

ジョブの実行

通常、ジョブは非同期で実行されます。ジョブを作成すると、APIによって結果が即時に返され、作成に成功したかどうかが示されます。ジョブが成功したかどうかを調べるには、ジョブ表またはジョブ・ログを問い合せる必要があります。これが通常の動作ですが、特別な場合は、ジョブを同期で実行することもできます。

ジョブの非同期実行

ジョブの作成時に定義されたスケジュールに基づいて、ジョブを非同期で実行するようにスケジュールできます。この場合、ジョブはジョブ・コーディネータ宛に送られ、ジョブ・スレーブによって取り出され、実行されます。

ジョブの同期実行

ジョブの作成後は、RUN_JOBプロシージャのuse_current_session引数をTRUEに設定して、ジョブを同期で実行できます。この場合、ジョブは、コーディネータによって取り出されてジョブ・スレーブによって実行されるかわりに、RUN_JOBコールを起動したユーザー・セッション内で実行されます。

RUN_JOBプロシージャを使用すると、ジョブをテストしたり、指定したスケジュール外で実行できます。RUN_JOBuse_current_session引数をTRUEに設定してジョブを実行する場合、そのジョブのfailure_countおよびrun_countのカウントは変更されません。ただし、ジョブ・ログにはジョブの実行が反映されます。ジョブによって生成されたランタイム・エラーは、RUN_JOBの実行者に返送されます。

RUN_JOBを使用してチェーンを指し示すジョブを実行する場合は、use_current_sessionFALSEに設定する必要があります。

ジョブの実行環境

ジョブは、ジョブの所有者に直接付与された権限、またはデフォルトのログイン・ロールによって間接的に付与された権限で実行されます。外部OSのロールはサポートされていません。適切な権限が付与されている場合、ユーザーは他のユーザーのスキーマ内にジョブを作成できます。したがって、ジョブの作成者と所有者は異なる場合があります。たとえば、ユーザーjimCREATE ANY JOB権限があり、scottのスキーマ内にジョブを作成した場合、そのジョブはscottの権限で実行されます。

ジョブが作成されたセッションのNLS環境が保存され、ジョブの実行時に使用されます。ジョブが実行されるNLS環境を変更するには、別のNLS設定のセッション内にジョブを作成する必要があります。

外部ジョブの実行

外部ジョブは、データベースの外部で実行されるジョブです。外部ジョブはすべて、データベース管理者が外部ジョブ・サポートの構成時に決定した権限の低いゲスト・ユーザーで実行されます。実行可能ファイルは権限の低いゲスト・アカウントで実行されるため、必要なファイルとリソースに対するアクセス権限があることを確認する必要があります。すべてではありませんが、ほとんどのプラットフォームで外部ジョブがサポートされています。外部ジョブをサポートしていないプラットフォームの場合は、ジョブまたはプログラムの属性をEXECUTABLEタイプで作成または設定するとエラーになります。詳細は、使用しているオペレーティング・システム固有のマニュアルを参照してください。

外部ジョブの場合、job_typeEXECUTABLEで指定されます(名前付きプログラムを使用している場合は、対応するprogram_typeEXECUTABLEになります)。job_action(または名前付きプログラムを使用している場合は対応するprogram_action)は、必要な外部実行可能ファイルおよびコマンドライン引数(オプション)のオペレーティング・システム依存のフルパスです。たとえば、/usr/local/bin/perlC:¥perl¥bin¥perlなどです。タイプEXECUTABLEのプログラムまたはジョブの引数は、CHARVARCHAR2またはVARCHARなどの文字列型であることが必要です。

外部ジョブが権限の低いゲスト・ユーザーで確実に実行されるようにするには、インストール後の追加手順がいくつか必要となる場合があります。インストール後の構成手順については、オペレーティング・システム固有のマニュアルを参照してください。

注意

外部ジョブを使用可能にしたり実行するには、その所有者にCREATE EXTERNAL JOBシステム権限が必要です。 

外部ジョブの標準エラー出力の取得

外部ジョブによってstderrに出力が書き込まれるときは、最初の200バイトが*_SCHEDULER_JOB_RUN_DETAILSビューのadditional_info列に記録されます。情報は、次のような名前と値のペアの形式で記録されます。

STANDARD_ERROR="text"

ジョブの停止

実行中の1つ以上のジョブを停止するには、STOP_JOBプロシージャまたはEnterprise Managerを使用します。STOP_JOBは、ジョブおよびジョブ・クラスのカンマ区切りのリストを受け入れます。ジョブ・クラスが指定されている場合、そのジョブ・クラス内の実行中のジョブはすべて停止されます。たとえば、次の文では、ジョブjob1とジョブ・クラスdw_jobs内のすべてのジョブが停止されます。

BEGIN
DBMS_SCHEDULER.STOP_JOB('job1, sys.dw_jobs');
END;
/

指定したジョブのインスタンスはすべて停止されます。ジョブの停止後、1回かぎりのジョブの状態はSTOPPEDに設定され、繰返しジョブの状態は、(次回のジョブ実行がスケジュールされているため)SCHEDULEDに設定されます。また、ジョブ・ログには、OPERATIONが'STOPPED'に設定され、ADDITIONAL_INFOが'REASON="Stop job called by user: username"'に設定されたエントリが作成されます。

デフォルトでは、スケジューラは割込みメカニズムを使用してジョブを正常に停止しようとします。この方法では、制御がスレーブ・プロセスに戻され、スレーブ・プロセスはジョブ実行の統計を収集できます。forceオプションがTRUEに設定されている場合、ジョブは即時に停止するため、そのジョブ実行について特定の実行時間の統計が使用できない場合があります。

チェーンを実行中のジョブを停止すると、実行中のすべてのステップが(各ステップでforceオプションをTRUEに設定してSTOP_JOBをコールすることによって)自動的に停止されます。

STOP_JOBプロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。


注意

ジョブが停止したときにロールバックされるのは、現行トランザクションのみです。これは、データの一貫性を損なう原因となる場合があります。 


外部ジョブの停止

スケジューラを使用している場合、外部ジョブの実装者は、forceFALSEに設定されたSTOP_JOBがコールされた場合に、その外部ジョブを正常にクリーン・アップするメカニズムを利用できます。UNIXでは、このメカニズムは、外部ジョブ・エージェントによって起動されたプロセスにSIGTERMシグナルを送信することによって実行されます。外部ジョブの実装者は、割込みハンドラにSIGTERMをトラップし、ジョブの実行内容をすべてクリーン・アップし、終了する必要があります。Windowsでは、forceFALSEに設定されたSTOP_JOBは、Windows XP、Windows 2003およびそれ以降のオペレーティング・システムでのみサポートされます。これらのプラットフォームでは、外部ジョブ・エージェントによって起動されるプロセスがコンソール・プロセスです。このプロセスを停止するために、スケジューラはCTRL-BREAKをプロセスに送信します。CTRL_BREAKは、SetConsoleCtrlHandler()ルーチンにハンドラを登録することによって処理できます。

ジョブの削除

1つ以上のジョブを削除するには、DROP_JOBプロシージャまたはEnterprise Managerを使用します。DROP_JOBは、ジョブおよびジョブ・クラスのカンマ区切りのリストを受け入れます。ジョブ・クラスが指定されている場合、そのジョブ・クラス内のジョブはすべて削除されます。ただし、そのジョブ・クラス自体は削除されません。

ジョブを削除すると、そのジョブはジョブ表から削除され、そのメタデータも削除され、*_SCHEDULER_JOBSビューに表示されなくなります。したがって、これ以降ジョブは実行されません。

コール時にジョブのインスタンスが実行中の場合、そのコールはエラーになります。この場合でも、コールでforceオプションをTRUEに設定すると、ジョブを削除できます。forceオプションをTRUEに設定すると、まず、実行中のジョブ・インスタンスが停止され(forceオプションをFALSEに設定してSTOP_JOBをコール)、その後ジョブが削除されます。 デフォルトでは、forceFALSEに設定されています。

たとえば、次の文では、ジョブjob1job3、およびジョブ・クラスjobclass1jobclass2内のすべてのジョブが削除されます。

BEGIN
DBMS_SCHEDULER.DROP_JOB ('job1, job3, sys.jobclass1, sys.jobclass2');
END;
/

ジョブ・クラスを削除するには、DROP_JOB_CLASSプロシージャを使用してください。 ジョブ・クラスの削除方法は、「ジョブ・クラスの削除」を参照してください。

DROP_JOBプロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

ジョブの使用禁止

1つ以上のジョブを使用禁止にするには、DISABLEプロシージャまたはEnterprise Managerを使用します。ジョブは他の理由で使用禁止になる場合もあります。たとえば、ジョブが属しているジョブ・クラスが削除されると、ジョブは使用禁止になります。また、ジョブが指し示しているプログラムまたはスケジュールのいずれかが削除された場合も使用禁止になります。ジョブが指し示しているプログラムまたはスケジュールが使用禁止の場合は、そのジョブ自体は使用禁止にならないため、スケジューラがジョブを実行しようとしたときに、エラーとなることに注意してください。

ジョブを使用禁止にすると、そのジョブのメタデータはそのまま存在しますが、ジョブ自体は実行対象ではないため、ジョブ・コーディネータがこれらのジョブを取り出して処理することはありません。ジョブが使用禁止になると、ジョブ表内のそのstatedisabledに変更されます。

forceオプションをFALSEに設定してジョブを使用禁止にすると、ジョブが現在実行中の場合はエラーが返されます。forceTRUEに設定されているときは、ジョブは使用禁止になりますが、現在実行中のインスタンスは完了できます。

DISABLEプロシージャ・コールにジョブ名またはジョブ・クラス名のカンマ区切りのリストを指定することで、1回のコールで複数のジョブを使用禁止にすることもできます。たとえば、次の文では、ジョブとジョブ・クラスを組み合せて指定しています。

BEGIN
DBMS_SCHEDULER.DISABLE('job1, job2, job3, sys.jobclass1, sys.jobclass2');
END;
/

DISABLEプロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

ジョブの使用可能化

1つ以上のジョブを使用可能にするには、ENABLEプロシージャまたはEnterprise Managerを使用します。このプロシージャを使用すると、ジョブは、ジョブ・コーディネータによって取り出され、処理されるようになります。ジョブは、デフォルトで使用禁止で作成されるため、実行するには使用可能にする必要があります。ジョブを使用可能にすると、妥当性チェックが実行されます。チェックに失敗すると、ジョブは使用可能になりません。

ENABLEプロシージャ・コールにジョブ名またはジョブ・クラス名のカンマ区切りのリストを指定することで、1回のコールで複数のジョブを使用可能にすることもできます。たとえば、次の文では、ジョブとジョブ・クラスを組み合せて指定しています。

BEGIN
DBMS_SCHEDULER.ENABLE ('job1, job2, job3, 
   sys.jobclass1, sys.jobclass2, sys.jobclass3');
END;
/

ENABLEプロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

プログラムの使用

プログラムは、特定のタスクに関するメタデータの集合です。この項では、プログラムの基本的なタスクについて説明します。この項の内容は、次のとおりです。

プログラムのタスクとそのプロシージャ

表27-2に、プログラムの一般的なタスクとそれに対応するプロシージャおよび権限を示します。

表 27-2    プログラムのタスクとそのプロシージャ 
タスク  プロシージャ  必要な権限 

プログラムの作成 

CREATE_PROGRAM  

CREATE JOBまたはCREATE ANY JOB 

プログラムの変更 

SET_ATTRIBUTE  

ALTERまたはCREATE ANY JOB、あるいは所有者 

プログラムの削除 

DROP_PROGRAM  

ALTERまたはCREATE ANY JOB、あるいは所有者 

プログラムの使用禁止 

DISABLE  

ALTERまたはCREATE ANY JOB、あるいは所有者 

プログラムの使用可能化 

ENABLE  

ALTERまたはCREATE ANY JOB、あるいは所有者 

権限に関する詳細は、「スケジューラ権限の管理方法」を参照してください。

プログラムの作成

プログラムを作成するには、CREATE_PROGRAMプロシージャまたはEnterprise Managerを使用します。デフォルトでは、プログラムは作成者のスキーマ内に作成されます。別のユーザーのスキーマ内にプログラムを作成するには、プログラム名をスキーマ名で修飾する必要があります。他のユーザーがプログラムを使用する場合、そのユーザーにはそのプログラムに対するEXECUTE権限が必要です。したがって、プログラムを作成した後で、そのプログラムに対するEXECUTE権限を付与する必要があります。次に、プログラムの作成例を示します。この例では、my_program1というプログラムが作成されます。

BEGIN
DBMS_SCHEDULER.CREATE_PROGRAM (
   program_name           => 'my_program1',
   program_action         => '/usr/local/bin/date',
   program_type           => 'EXECUTABLE',
   comments               => 'My comments here');
END;
/

プログラム引数の定義

プログラムを作成した後は、各プログラム引数の名前またはデフォルト値を定義できます。プログラム引数にデフォルト値が定義されていない場合は、プログラムを参照するジョブで引数値を指定する必要があります(ジョブでデフォルト値を上書きすることもできます)。ジョブを使用可能にするには、すべての引数値を定義する必要があります。

プログラム引数値を設定するには、DEFINE_PROGRAM_ARGUMENTまたはDEFINE_ANYDATA_ARGUMENTプロシージャを使用します。DEFINE_ANYDATA_ARGUMENTは、ANYDATAオブジェクト内にカプセル化する必要がある複雑な型に使用されます。引数を必要とする場合があるプログラムの例の1つに、開始日と終了日が必要なレポート作成プログラムを開始するジョブがあります。次のコード例では、レポート作成プログラムの2番目の引数である終了日の引数が設定されます。この例では、SET_JOB_ANYDATA_VALUESET_JOB_ARGUMENT_VALUEなどの他のパッケージ・プロシージャから(位置ではなく)名前で引数を参照できるように、引数に名前が割り当てられています。

BEGIN
DBMS_SCHEDULER.DEFINE_PROGRAM_ARGUMENT (
   program_name            => 'operations_reporting',
   argument_position       => 2,
   argument_name           => 'end_date',
   argument_type           => 'VARCHAR2',
   default_value           => '12-DEC-03');
END;
/

プログラム引数は、名前または位置で削除できます。次に例を示します。

BEGIN
DBMS_SCHEDULER.DROP_PROGRAM_ARGUMENT (
   program_name            => 'operations_reporting',
   argument_position       => 2);

DBMS_SCHEDULER.DROP_PROGRAM_ARGUMENT (
   program_name            => 'operations_reporting',
   argument_name           => 'end_date');
END;
/

一部の特殊なケースでは、プログラムのロジックがスケジューラの環境によって異なる場合があります。この目的のために、スケジューラには、プログラムに引数として渡すことができる事前定義のメタデータ引数がいくつかあります。たとえば、スケジュールがウィンドウ名である一部のジョブについては、ジョブの開始時にウィンドウがオープンしている時間の長さを認識していると便利です。これは、ウィンドウ終了時間をプログラムに対するメタデータ引数として定義すると可能です。

特定ジョブのメタデータに対するアクセス権限がプログラムに必要な場合は、プログラムの実行時にスケジューラによって値が指定されるように、DEFINE_METADATA_ARGUMENTプロシージャを使用して特別なメタデータ引数を定義できます。

関連項目

DEFINE_PROGRAM_ARGUMENTDEFINE_ANYDATA_ARGUMENTおよびDEFINE_METADATA_ARGUMENTプロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。 

プログラムの変更

プログラムを変更するには、Enterprise ManagerまたはDBMS_SCHEDULER.SET_ATTRIBUTEおよびDBMS_SCHEDULER.SET_ATTRIBUTE_NULLパッケージ・プロシージャを使用します。 DBMS_SCHEDULERパッケージ・プロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

次に、Enterprise Managerを使用したプログラムの変更方法を示します。

  1. 「管理」ページから、「プログラム」をクリックします。

    「スケジューラのプログラム」ページが表示されます。このページには既存のプログラムが表示されます。

  2. 「選択」列をクリックしてプログラムを選択し、「編集」をクリックします。

    「プログラムの編集」ページが表示されます。

  3. 「有効」ヘッダーの横にある「はい」または「いいえ」を選択します。

  4. 「説明」フィールドで、コメントを変更します。

  5. 「タイプ」ドロップダウン・リストから、次のいずれかを選択します。

    • PLSQL_BLOCK

      「ソース」フィールドが表示されます。このフィールドでPL/SQLコードを入力または変更します。

    • STORED_PROCEDURE

      「プロシージャ名」フィールドが表示されます。フィールドにストアド・プロシージャ名が含まれている場合は、「プロシージャの表示」をクリックするとストアド・プロシージャを表示または編集できます。フィールドが空白の場合、またはストアド・プロシージャを変更する場合は、「プロシージャの選択」をクリックします。「プロシージャの選択」ページが表示されます。ストアド・プロシージャを選択して「選択」をクリックすると、「プログラムの編集」ページに戻ります(「プロシージャの選択」ページの使用方法に関するヘルプについては、ページ上部の「ヘルプ」をクリックしてください)。

      プロシージャ名を選択すると、「プログラムの編集」ページの「引数」ヘッダーの下に、引数リストが表示されます。オプションで、1つ以上の引数のデフォルト値を入力します。

    • EXECUTABLE

      「実行可能な名前」フィールドが表示されます。実行可能ファイルのフルパスを入力します。「引数」ヘッダーの下にある引数を編集または削除するか、あるいは「行の追加」をクリックして引数を追加します。

  6. 「適用」をクリックして変更内容を保存します。

変更したプログラムが、現在実行中のジョブで使用されている場合、そのジョブは変更操作前に定義されたプログラムで引き続き実行されます。

プログラムの削除

1つ以上のプログラムを削除するには、DROP_PROGRAMプロシージャまたはEnterprise Managerを使用します。

削除されたプログラムを指し示している実行中のジョブはDROP_PROGRAMコールの影響を受けず、実行を継続できます。プログラムが削除されると、そのプログラムに関係する引数もすべて削除されます。プログラム名のカンマ区切りのリストを指定することで、1回のコールで複数のプログラムを削除できます。たとえば、次の文では3つのプログラムが削除されます。

BEGIN
DBMS_SCHEDULER.DROP_PROGRAM('program1, program2, program3');
END;
/

DROP_PROGRAMプロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

プログラムの使用禁止

1つ以上のプログラムを使用禁止にするには、DISABLEプロシージャまたはEnterprise Managerを使用します。プログラムが使用禁止になると、ステータスがdisabledに変更されます。使用禁止プログラムとは、メタデータは存在しているが、このプログラムを指し示すジョブは実行できないことを意味します。

使用禁止のプログラムを指し示している実行中のジョブはDISABLEコールの影響を受けず、実行を継続できます。プログラムが使用禁止になった場合でも、そのプログラムに関係する引数は影響を受けません。

プログラムは他の理由で使用禁止になる場合もあります。たとえば、プログラム引数が削除された場合やnumber_of_argumentsの変更ですべての引数を定義できなくなった場合などです。

DISABLEプロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

プログラム使用可能化

1つ以上のプログラムを使用可能にするには、ENABLEプロシージャまたはEnterprise Managerを使用します。プログラムを使用可能にすると、使用可能フラグがTRUEに設定されます。プログラムは、デフォルトで使用禁止で作成されるため、そのプログラムを指し示すジョブを使用可能にするには、プログラムを使用可能にする必要があります。プログラムが使用可能になる前に、処理が有効であること、およびすべての引数が定義されていることを確認するために妥当性チェックが実行されます。

ENABLEプロシージャ・コールにプログラム名のカンマ区切りのリストを指定することで、1回のコールで複数のプログラムを使用可能にできます。たとえば、次の文では3つのプログラムが使用可能になります。

BEGIN
DBMS_SCHEDULER.ENABLE('program1, program2, program3');
END;
/

ENABLEプロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

スケジュールの使用

スケジュールは、ジョブの実行時期またはウィンドウのオープン時期を定義します。スケジュールは、データベースにオブジェクトとして作成および保存することによってユーザー間で共有できます。

この項では、スケジュールの基本的なタスクについて説明します。この項の内容は、次のとおりです。

スケジュールのタスクとそのプロシージャ

表27-3に、スケジュールの一般的なタスクとその処理に使用するプロシージャを示します。

表 27-3    スケジュールのタスクとそのプロシージャ 
タスク  プロシージャ  必要な権限 

スケジュールの作成 

CREATE_SCHEDULE  

CREATE JOBまたはCREATE ANY JOB 

スケジュールの変更 

SET_ATTRIBUTE  

ALTERまたはCREATE ANY JOB、あるいは所有者 

スケジュールの削除 

DROP_SCHEDULE  

ALTERまたはCREATE ANY JOB、あるいは所有者 

権限に関する詳細は、「スケジューラ権限の管理方法」を参照してください。

スケジュールの作成

スケジュールを作成するには、CREATE_SCHEDULEプロシージャまたはEnterprise Managerを使用します。スケジュールは、そのスケジュールを作成するユーザーのスキーマ内に作成され、最初に作成した時点で使用可能です。また、別のユーザーのスキーマ内に作成できます。作成したスケジュールは、他のユーザーが使用できます。スケジュールはPUBLICに対するアクセス権限付きで作成されます。したがって、スケジュールに対するアクセス権限を明示的に付与する必要はありません。次に、スケジュールの作成例を示します。

BEGIN
DBMS_SCHEDULER.CREATE_SCHEDULE (
  schedule_name     => 'my_stats_schedule',
  start_date        => SYSTIMESTAMP,
  end_date          => SYSTIMESTAMP + INTERVAL '30' day,
  repeat_interval   => 'FREQ=HOURLY; INTERVAL=4',
  comments          => 'Every 4 hours');
END;
/

CREATE_SCHEDULEプロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

スケジュールの変更

スケジュールを変更するには、SET_ATTRIBUTEプロシージャまたはEnterprise Managerを使用します。スケジュールを変更すると、スケジュールの定義が変更されます。スケジュール名以外のすべての属性を変更できます。スケジュールの属性は、*_SCHEDULER_SCHEDULESビューで使用可能です。

スケジュールを変更しても、このスケジュールを使用している実行中のジョブとオープン中のウィンドウに影響を与えることはありません。変更が有効になるのは、次回のジョブ実行時またはウィンドウ・オープン時からです。

SET_ATTRIBUTEプロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

スケジュールの削除

スケジュールを削除するには、DROP_SCHEDULEプロシージャまたはEnterprise Managerを使用します。このプロシージャ・コールによって、スケジュール・オブジェクトがデータベースから削除されます。

DROP_SCHEDULEプロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

繰返し間隔の設定

ジョブの繰返し時期および間隔を制御するには、ジョブ自体またはジョブが参照する名前付きスケジュールのrepeat_interval属性を設定します。repeat_intervalは、DBMS_SCHEDULERパッケージまたはEnterprise Managerで設定できます。

repeat_intervalの評価結果は一連のタイムスタンプです。スケジューラは各タイムスタンプの日時にジョブを実行します。ジョブやスケジュールからの開始日も、タイムスタンプの結果セットを決定する要因となることに注意してください (repeat_intervalの評価の詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください)。repeat_intervalに値が指定されていない場合、ジョブは指定した開始日に1回のみ実行されます。

ジョブの開始直後にrepeat_intervalが評価され、スケジュールされた次回のジョブ実行時間が判別されます。ジョブがまだ実行されている間に、スケジュールされた次回のジョブ実行時間に達する可能性があります。しかし、ジョブの新規インスタンスは、現在のジョブが完了するまでは開始されません。

繰返し間隔を指定する方法は、次の2通りあります。

スケジューラのカレンダ指定構文の使用方法

ジョブの繰返し間隔を設定する主要な方法は、スケジューラのカレンダ指定式を使用してrepeat_interval属性を設定する方法です。 repeat_intervalのカレンダ指定構文およびCREATE_SCHEDULEプロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

カレンダ指定式の例

次に、簡単な繰返し間隔の例を示します。わかりやすくするために、開始日は評価結果に影響を与えないと仮定します。

毎週金曜日に実行(3つの例はすべて等価です)

FREQ=DAILY; BYDAY=FRI;
FREQ=WEEKLY; BYDAY=FRI;
FREQ=YEARLY; BYDAY=FRI;

隔週金曜日に実行

FREQ=WEEKLY; INTERVAL=2; BYDAY=FRI;

毎月末に実行

FREQ=MONTHLY; BYMONTHDAY=-1;

毎月末の翌日に実行

FREQ=MONTHLY; BYMONTHDAY=-2;

3月10日に実行(2つの例は等価です)

FREQ=YEARLY; BYMONTH=MAR; BYMONTHDAY=10;
FREQ=YEARLY; BYDATE=0310;

10日おきに実行

FREQ=DAILY; INTERVAL=10;

毎日午後4時、5時および6時に実行

FREQ=DAILY; BYHOUR=16,17,18;

隔月15日に実行

FREQ=MONTHLY; INTERVAL=2; BYMONTHDAY=15;

毎月29日に実行

FREQ=MONTHLY; BYMONTHDAY=29;

毎月第2水曜日に実行

FREQ=MONTHLY; BYDAY=2WED;

毎年最終金曜日に実行

FREQ=YEARLY; BYDAY=-1FRI;

50時間おきに実行

FREQ=HOURLY; INTERVAL=50;

隔月末に実行

FREQ=MONTHLY; INTERVAL=2; BYMONTHDAY=-1;

毎月初めの3日間1時間おきに実行

FREQ=HOURLY; BYMONTHDAY=1,2,3;

以降は、多少複雑な繰返し間隔の例です。

毎月最後の稼働日に実行(稼働日は月曜日〜金曜日と仮定)

FREQ=MONTHLY; BYDAY=MON,TUE,WED,THU,FRI; BYSETPOS=-1

会社の休業日を除いて、毎月最後の稼働日に実行(この例では、既存の名前付きスケジュールCompany_Holidaysを参照)

FREQ=MONTHLY; BYDAY=MON,TUE,WED,THU,FRI; EXCLUDE=Company_Holidays; BYSETPOS=-1

毎週金曜日および会社の休業日の正午に実行

FREQ=YEARLY;BYDAY=FRI;BYHOUR=12;INCLUDE=Company_Holidays

7月4日、戦没将兵記念日、労働者の日の3つの休日に実行(この例では、それぞれ休日に対応する日を定義する既存の3つの名前付きスケジュールJUL4MEMおよびLABを参照)

JUL4,MEM,LAB
カレンダ指定式評価の例

繰返し間隔を"FREQ=MINUTELY;INTERVAL=2;BYHOUR=17; BYMINUTE=2,4,5,50,51,7;"に、開始日を28-FEB-2004 23:00:00に設定すると、次のスケジュールが生成されます。

SUN 29-FEB-2004 17:02:00
SUN 29-FEB-2004 17:04:00
SUN 29-FEB-2004 17:50:00
MON 01-MAR-2004 17:02:00
MON 01-MAR-2004 17:04:00
MON 01-MAR-2004 17:50:00
...

繰返し間隔を"FREQ=MONTHLY;BYMONTHDAY=15, -1"に、開始日を29-DEC-2003 9:00:00に設定すると、次のスケジュールが生成されます。

WED 31-DEC-2003 09:00:00
THU 15-JAN-2004 09:00:00
SAT 31-JAN-2004 09:00:00
SUN 15-FEB-2004 09:00:00
SUN 29-FEB-2004 09:00:00
MON 15-MAR-2004 09:00:00
WED 31-MAR-2004 09:00:00
...

繰返し間隔を"FREQ=MONTHLY;"に、開始日を29-DEC-2003 9:00:00に設定すると、次のスケジュールが生成されます(BYMONTHDAY句がないため、日付指定(月)が開始日から取得されることに注意してください)。

MON 29-DEC-2003 09:00:00
THU 29-JAN-2004 09:00:00
SUN 29-FEB-2004 09:00:00
MON 29-MAR-2004 09:00:00
...
カレンダ指定式の使用例

カレンダ指定構文を使用した次の例について考えてみます。

BEGIN
DBMS_SCHEDULER.CREATE_JOB (
   job_name             => 'scott.my_job1',
   start_date           => '15-JUL-04 01.00.00 AM Europe/Warsaw',
   repeat_interval      => 'FREQ=MINUTELY; INTERVAL=30;',
   end_date             => '15-SEP-04 01.00.00 AM Europe/Warsaw',
   comments             => 'My comments here');
END;
/

この文では、scott内にmy_job1が作成されます。このジョブの開始日は7月15日、終了日は9月15日で、30分おきに実行されます。

PL/SQL式の使用方法

カレンダ指定構文より複雑な機能が必要な場合は、PL/SQL式を使用できます。ただし、PL/SQL式はウィンドウまたは名前付きスケジュールでは使用できません。また、日付またはタイムスタンプに評価される必要があります。これ以外に制限はないため、適切なプログラミングによって、あらゆる繰返し間隔を作成できます。次の例について考えてみます。

BEGIN
DBMS_SCHEDULER.CREATE_JOB (
   job_name             => 'scott.my_job2', 
   start_date           => '15-JUL-04 01.00.00 AM Europe/Warsaw',
   repeat_interval      => 'SYSTIMESTAMP + INTERVAL '30' MINUTE',
   end_date             => '15-SEP-04 01.00.00 AM Europe/Warsaw',
   comments             => 'My comments here');
END;
/

この文では、scott内にmy_job1が作成されます。このジョブの開始日は7月15日で、30分おきに実行され9月15日に終了します。ジョブが30分おきに実行されるのは、repeat_intervalSYSTIMESTAMP + INTERVAL '30' MINUTEに設定されており、この式では30分後が戻されるためです。

PL/SQL式とカレンダ指定構文の動作の相違点

カレンダ指定式とPL/SQL繰返し間隔の動作には、次のような重要な相違があります。

この2つの違いを示すために、次の状況を考えてみます。開始日は15-July-2003 1:45:00、繰返しは2時間おきとします。カレンダ式"FREQ=HOURLY; INTERVAL=2; BYMINUTE=0;"では、次のスケジュールが生成されます。

TUE 15-JUL-2003  03:00:00
TUE 15-JUL-2003  05:00:00
TUE 15-JUL-2003  07:00:00
TUE 15-JUL-2003  09:00:00
TUE 15-JUL-2003  11:00:00
...

カレンダ式では、2時間おきの毎正時に繰返しを実行します。

一方、PL/SQL式"SYSTIMESTAMP + interval '2' hour"では、実行時間は次のようになります。

TUE 15-JUL-2003  01:45:00
TUE 15-JUL-2003  03:45:05
TUE 15-JUL-2003  05:45:09
TUE 15-JUL-2003  07:45:14
TUE 15-JUL-2003  09:45:20
...

繰返し間隔と夏時間

ジョブの繰返しでは、次回のジョブ実行時間のスケジュールは、タイムゾーン列のあるタイムスタンプに格納されます。カレンダ指定構文を使用する場合、タイムゾーンはstart_dateから取り出されます。 start_dateが設定されていない場合の操作の詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

PL/SQL式に基づいた繰返し間隔の場合、タイムゾーンはPL/SQL式が返すタイムスタンプの一部になっています。いずれの場合も、リージョン名を使用することが重要です。たとえば、"+2:00"のように絶対タイムゾーン・オフセットを指定するのではなく、"Europe/Istanbul"のように指定します。タイムゾーンがリージョン名で指定されている場合のみ、スケジューラはそのリージョンに適用される夏時間調整に従います。

ジョブ・クラスの使用

ジョブ・クラスを使用すると、リソース割当ておよび優先順位付けの目的でジョブをグループ化でき、一連の属性値をメンバーのジョブに簡単に割り当てることができます。

データベースとともに作成されるデフォルトのジョブ・クラスがあります。ジョブ・クラスを指定せずにジョブを作成すると、ジョブはこのデフォルトのジョブ・クラス(DEFAULT_JOB_CLASS)に割り当てられます。デフォルトのジョブ・クラスでは、EXECUTE権限がPUBLICに付与されているため、ジョブの作成権限を持つすべてのデータベース・ユーザーは、デフォルトのジョブ・クラスにジョブを作成できます。

この項では、ジョブ・クラスの基本的なタスクについて説明します。この項の内容は、次のとおりです。

ジョブ・クラスのタスクとそのプロシージャ

表27-4に、ジョブ・クラスの一般的なタスクとそれに対応するプロシージャと権限を示します。

表 27-4    ジョブ・クラスのタスクとそのプロシージャ 
タスク  プロシージャ  必要な権限 

ジョブ・クラスの作成 

CREATE_JOB_CLASS  

MANAGE SCHEDULER 

ジョブ・クラスの変更 

SET_ATTRIBUTE  

MANAGE SCHEDULER 

ジョブ・クラスの削除 

DROP_JOB_CLASS  

MANAGE SCHEDULER 

権限に関する詳細は、「スケジューラ権限の管理方法」を参照してください。

ジョブ・クラスの作成

ジョブ・クラスを作成するには、CREATE_JOB_CLASSプロシージャまたはEnterprise Managerを使用します。たとえば、次の文では、すべての財務ジョブ用のジョブ・クラスが作成されます。

BEGIN
DBMS_SCHEDULER.CREATE_JOB_CLASS (
   job_class_name             =>  'finance_jobs', 
   resource_consumer_group    =>  'finance_group');
END;
/

ジョブ・クラスを問い合せるには、*_SCHEDULER_JOB_CLASSESビューを使用します。

SET_ATTRIBUTEプロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。また、ジョブ・クラスの作成例は、「スケジューラの構成」を参照してください。

ジョブ・クラスの変更

ジョブ・クラスを変更するには、SET_ATTRIBUTEプロシージャまたはEnterprise Managerを使用します。また、ジョブ・クラス名以外のすべての属性を変更できます。ジョブ・クラスの属性は、*_SCHEDULER_JOB_CLASSESビューで使用可能です。

ジョブ・クラスを変更しても、そのクラスに属する実行中のジョブは影響を受けません。変更は、まだ実行が開始されていないジョブに対してのみ有効です。

SET_ATTRIBUTEプロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。また、「スケジューラの構成」を参照してください。

ジョブ・クラスの削除

1つ以上のジョブ・クラスを削除するには、DROP_JOB_CLASSプロシージャまたはEnterprise Managerを使用します。ジョブ・クラスを削除すると、そのジョブ・クラスに関するすべてのメタデータがデータベースから削除されます。

DROP_JOB_CLASSプロシージャ・コールにジョブ・クラス名のカンマ区切りのリストを指定することで、1回のコールで複数のジョブ・クラスを削除できます。たとえば、次の文では3つのジョブ・クラスが削除されます。

BEGIN
DBMS_SCHEDULER.DROP_JOB_CLASS('jobclass1, jobclass2, jobclass3');
END;
/

DROP_JOB_CLASSプロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

ウィンドウの使用

ウィンドウを使用すると、異なる時間帯で別々のリソース・プランを自動的にアクティブにできます。ジョブを実行すると、そのジョブに割り当てられているリソースが、リソース・プランの変更時に変わることがわかります。

ウィンドウの主な属性は次のとおりです。

特定の時間に有効にできるウィンドウは1つのみです。ウィンドウはSYSスキーマに属します。

すべてのウィンドウ・アクティビティは、*_SCHEDULER_WINDOW_LOGビュー(ウィンドウ・ログと呼ばれます)に記録されます。 ウィンドウ・ログの記録例は、「ウィンドウ・ログ」を参照してください。

この項では、ウィンドウの基本的なタスクについて説明します。この項の内容は、次のとおりです。

ウィンドウのタスクとそのプロシージャ

表27-5に、ウィンドウの一般的なタスクとその処理に使用するプロシージャを示します。

表 27-5    ウィンドウのタスクとそのプロシージャ 
タスク  プロシージャ  必要な権限 

ウィンドウの作成 

CREATE_WINDOW  

MANAGE SCHEDULER 

ウィンドウのオープン 

OPEN_WINDOW  

MANAGE SCHEDULER 

ウィンドウのクローズ 

CLOSE_WINDOW  

MANAGE SCHEDULER 

ウィンドウの変更 

SET_ATTRIBUTE  

MANAGE SCHEDULER 

ウィンドウの削除 

DROP_WINDOW  

MANAGE SCHEDULER 

ウィンドウの使用禁止 

DISABLE  

MANAGE SCHEDULER 

ウィンドウの使用可能化 

ENABLE  

MANAGE SCHEDULER 

権限に関する詳細は、「スケジューラ権限の管理方法」を参照してください。

ウィンドウの作成

ウィンドウを作成するには、Enterprise ManagerまたはDBMS_SCHEDULER.CREATE_WINDOWパッケージ・プロシージャを使用します。これらの作成方法には、一方はPL/SQLを使用し、もう一方はグラフィカル・ユーザー・インタフェースを使用すること以外に、異なる点が1つあります。パッケージ・プロシージャを使用する場合は、resource_planパラメータをNULLのままにできることです。この場合は、ウィンドウのオープン時に現行のプランが有効のままになります。詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』および「スケジューラの構成」を参照してください。

次に、Enterprise Managerを使用したウィンドウの作成方法を示します。

  1. 「管理」ページから、「データベース・スケジューラ」ヘッダーの下にある「ウィンドウ」をクリックします。

    「スケジューラのウィンドウ」ページが表示されます。このページには既存のウィンドウが表示されます。

  2. 「作成」をクリックします。

    「ウィンドウの作成」ページが表示されます。

  3. ウィンドウ名を入力します。

  4. 「リソース・プラン」ドロップダウン・リストからリソース・プランを選択するか、またはリソース・プランを作成します。

    デフォルトのINTERNAL_PLANを使用できます。 既存のリソース・プランの内容を表示するには、「リソース・プランの表示」をクリックします。 新規リソース・プランを作成する場合は、「リソース・プランの作成」をクリックしてその手順を実行します。

  5. 優先順位「低」または「高」を選択します。

  6. 「説明」フィールドにオプションのコメントを入力します。

  7. 「スケジュール」ヘッダーの下で、次のいずれかを実行します。

  8. タイムゾーンを変更する場合は、「タイムゾーン」フィールドの横にある懐中電灯アイコンをクリックし、その手順を実行します。

  9. 「繰返し」ドロップダウン・リストの下で、ウィンドウの繰返し間隔を選択します。 「繰返しなし」以外の値を選択すると、間隔および開始時間を入力できるページに変わります。

  10. 「開始可能時間」ヘッダーの下で、スケジュールの開始を「即時」または「後で」から選択します。「後で」を選択した場合は日付を入力します。

  11. 「継続時間」ヘッダーの下で、ウィンドウのオープン期間を入力します。

  12. 「終了期限」ヘッダーの下で、オプションの終了日を指定します。

  13. 「OK」をクリックしてウィンドウを保存します。

ウィンドウの変更

ウィンドウを変更するには、SET_ATTRIBUTEプロシージャまたはEnterprise Managerを使用します。変更するときは、WINDOW_NAME以外のすべてのウィンドウ属性を変更できます。ウィンドウの属性は、*_SCHEDULER_WINDOWSビューで使用可能です。

ウィンドウを変更しても、アクティブなウィンドウには影響を与えません。変更は、次回ウィンドウがオープンしたときに有効になります。

すべてのウィンドウを変更できます。使用禁止のウィンドウを変更した場合は、変更した後も使用禁止のままです。使用可能なウィンドウは自動的に使用禁止になり、変更後、使用可能化プロセスで実行される妥当性チェックが成功した場合は再び使用可能になります。

SET_ATTRIBUTEプロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。また、「スケジューラの構成」を参照してください。

ウィンドウのオープン

ウィンドウがオープンすると、スケジューラは、ウィンドウの作成時に関連付けられたリソース・プランに切り替えます。ウィンドウのオープン時に実行中のジョブがある場合、そのジョブに割り当てられているリソースはリソース・プランの切替えによって変更される場合があります。

ウィンドウをオープンする方法は、次の2通りあります。

ウィンドウがオープンすると、ウィンドウ・ログにエントリが作成されます。

現在のリソース・プランが、ALTER SYSTEMFORCEオプションあるいはDBMS_RESOURCE_MANAGER.SWITCH_PLANパッケージ・プロシージャのallow_scheduler_plan_switches引数FALSEを使用して、手動で切り替えられたものである場合、ウィンドウでリソース・プランの切替えに失敗する可能性があります。この場合、リソース・プランの切替え失敗がウィンドウ・ログに書き込まれます。

OPEN_WINDOWプロシージャおよびDBMS_RESOURCE_MANAGER.SWITCH_PLANプロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

ウィンドウのクローズ

ウィンドウをクローズする方法は、次の2通りあります。

クローズしたウィンドウは、そのウィンドウが有効ではないことを意味します。ウィンドウがクローズすると、スケジューラは、リソース・プランをそのウィンドウ期間外で有効だったリソース・プランに切り替えるか、または重複ウィンドウがある場合は別のウィンドウに切り替えます。存在しないウィンドウやオープンしていないウィンドウをクローズしようとすると、エラーが生成されます。

実行中のジョブは、そのジョブが実行されているウィンドウがクローズした場合でも、stop_on_window_close属性がジョブの作成時にTRUEに設定されていないかぎりクローズしません。ただし、リソース・プランが変更される場合があるため、ジョブに割り当てられているリソースは変更される可能性があります。

実行中のジョブにスケジュールとしてウィンドウ・グループが設定されていると、そのジョブは、同じウィンドウ・グループのメンバーである別のウィンドウが元のウィンドウのクローズ時にアクティブになった場合、停止しません。これは、stop_on_window_close属性がTRUEに設定された状態でジョブが作成されている場合でも同じです。

ウィンドウがクローズ状態になると、ウィンドウ・ログDBA_SCHEDULER_WINDOW_LOGにエントリが追加されます。

CLOSE_WINDOWプロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

ウィンドウの削除

1つ以上のウィンドウを削除するには、DROP_WINDOWプロシージャまたはEnterprise Managerを使用します。ウィンドウが削除されると、そのウィンドウに関するすべてのメタデータが*_SCHEDULER_WINDOWSビューから削除されます。また、ウィンドウに対するすべての参照がウィンドウ・グループから削除されます。

DROP_WINDOWプロシージャにウィンドウ名またはウィンドウ・グループ名のカンマ区切りのリストを指定すると、1回のコールで複数のウィンドウを削除できます。たとえば、次の文ではウィンドウとウィンドウ・グループの両方が削除されます。

BEGIN
DBMS_SCHEDULER.DROP_WINDOW ('window1, window2, 
  window3, windowgroup1, windowgroup2');
END;
/

ウィンドウ・グループ名を指定した場合、ウィンドウ・グループ内のウィンドウは削除されますが、ウィンドウ・グループは削除されません。ウィンドウ・グループを削除するには、DROP_WINDOW_GROUPプロシージャを使用する必要があります。

DROP_WINDOWプロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

ウィンドウの使用禁止

1つ以上のウィンドウを使用禁止にするには、DISABLEプロシージャまたはEnterprise Managerを使用します。使用禁止のウィンドウはオープンしませんが、ウィンドウのメタデータは存在しているため、再び使用可能にできます。DISABLEプロシージャは複数のスケジューラ・オブジェクトに対して使用されるため、ウィンドウを使用禁止にするときは、先頭にSYSを付ける必要があります。

ウィンドウは他の理由で使用禁止になる場合もあります。たとえば、ウィンドウはそのスケジュールの終了時に使用禁止になります。また、存在しないスケジュールをウィンドウが指し示している場合も使用禁止になります。

スケジュールとしてウィンドウが設定されているジョブがある場合、そのウィンドウは、プロシージャ・コールでforceTRUEに設定しないかぎり、使用禁止にできません。 デフォルトでは、forceFALSEに設定されます。ウィンドウが使用禁止の場合でも、スケジュールとしてそのウィンドウが設定されているジョブは使用禁止になりません。

DISABLEプロシージャ・コールにウィンドウ名またはウィンドウ・グループ名のカンマ区切りのリストを指定することで、1回のコールで複数のウィンドウを使用禁止にすることもできます。たとえば、次の文ではウィンドウとウィンドウ・グループの両方が使用禁止になります。

BEGIN
DBMS_SCHEDULER.DISABLE ('sys.window1, sys.window2, 
   sys.window3, sys.windowgroup1, sys.windowgroup2');
END;
/

DISABLEプロシージャおよびウィンドウが使用禁止になる理由のリストの管理に関する詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

ウィンドウの使用可能化

1つ以上のウィンドウを使用可能にするには、ENABLEプロシージャまたはEnterprise Managerを使用します。使用可能なウィンドウとは、オープン可能なウィンドウのことです。ウィンドウは、デフォルトでenabledで作成されます。ENABLEプロシージャを使用してウィンドウを使用可能にすると、妥当性チェックが実行され、このチェックが成功した場合のみウィンドウは使用可能になります。ウィンドウが使用可能になると、ウィンドウ・ログ表にログが記録されます。ENABLEプロシージャは複数のスケジューラ・オブジェクトに対して使用されるため、ウィンドウを使用可能にするときは、先頭にSYSを付ける必要があります。

ウィンドウ名のカンマ区切りのリストを指定することで、1回のコールで複数のウィンドウを使用可能にできます。たとえば、次の文では3つのウィンドウが使用可能になります。

BEGIN
DBMS_SCHEDULER.ENABLE ('sys.window1, sys.window2, sys.window3');
END;
/

ENABLEプロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

重複ウィンドウ

お薦めする方法ではありませんが、ウィンドウは重複して設定できます。1度にアクティブにできるウィンドウは1つのみであるため、ウィンドウが重複したときにどのウィンドウをアクティブにするかを判別するために、次のルールが使用されます。

2つのウィンドウが重複した場合は、スケジューラのログにエントリが必ず記録されます。

重複ウィンドウの例

図27-1に、24時間スケジュールの場合のウィンドウ、リソース・プランおよび優先順位の判別方法に関する一般的な例を示します。次の2つの例では、ウィンドウ1はリソース・プラン1に、ウィンドウ2はリソース・プラン2に関連付けられ、以下も同様に関連付けられているとします。

図 27-1    ウィンドウとリソース・プラン(例1)


画像の説明

図27-1では、次の処理が発生します。

図27-2に、24時間スケジュールの場合のウィンドウ、リソース・プランおよび優先順位の判別方法に関する別の例を示します。

図 27-2    ウィンドウとリソース・プラン(例2)


画像の説明

図27-2では、次の処理が発生します。

ウィンドウ・グループの使用

ウィンドウ・グループを使用すると、1日あるいは1週間などの間に複数期間実行するジョブを簡単にスケジュールできます。ウィンドウ・グループを作成してウィンドウをグループに加え、ウィンドウ・グループ名をジョブのschedule_name属性に設定すると、ジョブがウィンドウ・グループ内のすべてのウィンドウの指定期間に実行されます。

ウィンドウ・グループはSYSスキーマに格納されます。この項では、ウィンドウ・グループの基本的なタスクについて説明します。この項の内容は、次のとおりです。

ウィンドウ・グループのタスクとそのプロシージャ

表27-6に、ウィンドウ・グループの一般的なタスクとその処理に使用するプロシージャを示します。

表 27-6    ウィンドウ・グループのタスクとそのプロシージャ 
タスク  プロシージャ  必要な権限 

ウィンドウ・グループの作成 

CREATE_WINDOW_GROUP  

MANAGE SCHEDULER 

ウィンドウ・グループの削除 

DROP_WINDOW_GROUP  

MANAGE SCHEDULER 

ウィンドウ・グループへのメンバーの追加 

ADD_WINDOW_GROUP_MEMBER  

MANAGE SCHEDULER 

ウィンドウ・グループからのメンバーの削除 

REMOVE_WINDOW_GROUP_MEMBER  

MANAGE SCHEDULER 

ウィンドウ・グループの使用可能化 

ENABLE  

MANAGE SCHEDULER 

ウィンドウ・グループの使用禁止 

DISABLE  

MANAGE SCHEDULER 

権限に関する詳細は、「スケジューラ権限の管理方法」を参照してください。

ウィンドウ・グループの作成

ウィンドウ・グループを作成するには、CREATE_WINDOW_GROUPプロシージャまたはEnterprise Managerを使用します。グループのメンバー・ウィンドウは、グループの作成時に指定するか、または後でADD_WINDOW_GROUP_MEMBERプロシージャを使用して追加できます。ウィンドウ・グループは別のウィンドウ・グループのメンバーとして設定できません。ただし、メンバーを設定しないウィンドウ・グループは作成できます。

ウィンドウ・グループを作成し、存在しないメンバー・ウィンドウを指定すると、エラーが生成され、ウィンドウ・グループは作成されません。ウィンドウがすでにウィンドウ・グループのメンバーである場合、再度追加されることはありません。

ウィンドウ・グループはSYSスキーマ内に作成されます。ウィンドウ・グループは、ウィンドウと同様に、PUBLICに対するアクセス権限付きで作成されるため、ウィンドウ・グループにアクセスするための権限は必要ありません。

次の文では、downtimeというウィンドウ・グループが作成され、2つのウィンドウ(weeknightsweekends)が追加されます。

BEGIN
DBMS_SCHEDULER.CREATE_WINDOW_GROUP (
   group_name   =>  'downtime',
   window_list  =>  'weeknights, weekends');
END;
/

CREATE_WINDOW_GROUPプロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

ウィンドウ・グループの削除

1つ以上のウィンドウ・グループを削除するには、DROP_WINDOW_GROUPプロシージャまたはEnterprise Managerを使用します。このプロシージャをコールすると、ウィンドウ・グループは削除されますが、ウィンドウ・グループのメンバーであるウィンドウは削除されません。ウィンドウ・グループ自体は削除せずに、ウィンドウ・グループのメンバーであるウィンドウをすべて削除する場合は、DROP_WINDOWプロシージャを使用し、そのコールにウィンドウ・グループ名を指定します。

DROP_WINDOW_GROUPプロシージャ・コールにウィンドウ・グループ名のカンマ区切りのリストを指定することで、1回のコールで複数のウィンドウ・グループを削除できます。たとえば、次の文では3つのウィンドウ・グループが削除されます。

BEGIN
DBMS_SCHEDULER.DROP_WINDOW_GROUP('windowgroup1, windowgroup2, windowgroup3');
END;
/

ウィンドウ・グループの追加および削除に関する詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

ウィンドウ・グループへのメンバーの追加

ウィンドウ・グループにウィンドウを追加するには、ADD_WINDOW_GROUP_MEMBERプロシージャを使用します。

ウィンドウのカンマ区切りのリストを指定すると、1回のコールで複数のメンバーをウィンドウ・グループに追加できます。たとえば、次の文ではウィンドウ・グループwindow_group1に3つのウィンドウが追加されます。

BEGIN
DBMS_SCHEDULER.ADD_WINDOW_GROUP_MEMBER ('window_group1',
   'window1, window2, window3');
END;
/

すでにオープンしているウィンドウがウィンドウ・グループに追加された場合、スケジューラは、ウィンドウ・グループ内の次のウィンドウがオープンするまで、このウィンドウ・グループを指し示すジョブを開始しません。

ADD_WINDOW_GROUP_MEMBERプロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

ウィンドウ・グループからのメンバーの削除

ウィンドウ・グループから1つ以上のウィンドウを削除するには、REMOVE_WINDOW_GROUP_MEMBERプロシージャまたはEnterprise Managerを使用します。stop_on_window_closeフラグが設定されているジョブが停止するのは、ウィンドウがクローズするときのみです。オープン中のウィンドウをウィンドウ・グループから削除しても、この処理への影響はありません。

ウィンドウのカンマ区切りのリストを指定すると、1回のコールで複数のメンバーをウィンドウ・グループから削除できます。たとえば、次の文では3つのウィンドウが削除されます。

BEGIN
DBMS_SCHEDULER.REMOVE_WINDOW_GROUP_MEMBER('window_group1', 'window1, window2,
   window3');
END;
/

REMOVE_WINDOW_GROUP_MEMBERプロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

ウィンドウ・グループの使用可能化

1つ以上のウィンドウ・グループを使用可能にするには、ENABLEプロシージャまたはEnterprise Managerを使用します。デフォルトでは、ウィンドウ・グループはENABLEDで作成されます。 次に例を示します。

BEGIN
DBMS_SCHEDULER.ENABLE('sys.windowgroup1', 'sys.windowgroup2, sys.windowgroup3');
END;
/

ENABLEプロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

ウィンドウ・グループの使用禁止

ウィンドウ・グループを使用禁止にするには、DISABLEプロシージャまたはEnterprise Managerを使用します。ウィンドウ・グループを使用禁止にした場合、そのウィンドウ・グループをスケジュールとして設定しているジョブは、メンバーのウィンドウがオープンしても実行されません。ただし、ウィンドウ・グループのメタデータはそのままであるため、ウィンドウ・グループを再び使用可能にできます。ウィンドウ・グループのメンバーはオープンすることに注意してください。

DISABLEプロシージャ・コールにウィンドウ・グループ名のカンマ区切りのリストを指定することで、1回のコールで複数のウィンドウ・グループを使用禁止にすることもできます。たとえば、次の文では3つのウィンドウ・グループが使用禁止になります。

BEGIN
DBMS_SCHEDULER.DISABLE('sys.windowgroup1, sys.windowgroup2, sys.windowgroup3');
END;
/

この例では、ウィンドウ・グループは使用禁止になりますが、ウィンドウ・グループのメンバーであるウィンドウは使用禁止になりません。

DISABLEプロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

イベントの使用

スケジューラは次の2種類のイベントを処理します。

この項では、両方のイベントの処理方法を詳細に説明します。内容は次のとおりです。

スケジューラによって呼び出されるイベントの使用

ジョブの状態が変化したときに、スケジューラがイベントを呼び出すようにジョブを設定できます。このためには、raise_eventsジョブ属性を設定します。この属性はCREATE_JOBプロシージャでは設定できないため、最初にジョブを作成し、SET_ATTRIBUTEプロシージャを使用してそのジョブを変更します。

デフォルトでは、SET_ATTRIBUTEを使用してジョブを変更するまで、ジョブによって状態変化のイベントは呼び出されません。

表27-7に、スケジューラによって呼び出されるイベントに関する1つの管理タスクの要約を示します。

表 27-7    スケジューラによって呼び出されるイベントに対するイベント・タスクとそのプロシージャ 
タスク  プロシージャ  必要な権限 

イベントを呼び出すようにジョブを変更する方法 

SET_ATTRIBUTE 

CREATE ANY JOB、あるいは変更対象のジョブの所有権またはそのジョブに対するALTER権限 

ジョブに対するジョブの状態変化イベントを使用可能にすると、スケジューラは、メッセージをスケジューラ・イベント・キューSYS.SCHEDULER$_EVENT_QUEUEにエンキューすることによってこれらのイベントを呼び出します。このキューはセキュアなキューであるため、アプリケーションによっては、特定のユーザーがキューの操作を実行できるようにキューを構成する必要があります。 セキュアなキューの詳細は、『Oracle Streams概要および管理』を参照してください。

スケジュール・イベント・キューが無制限に大きくならないように、スケジューラが呼び出したイベントは、デフォルトで24時間で期限切れになります(期限切れイベントはキューから削除されます)。この有効期限を変更するには、SET_SCHEDULER_ATTRIBUTEプロシージャを使用してevent_expiry_timeスケジューラ属性を設定します。 詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

イベントを呼び出すようにジョブを変更する方法

ジョブに対するジョブの状態変化イベントを使用可能にするには、SET_ATTRIBUTEプロシージャを使用して、raise_eventsジョブ属性のビット・フラグをオンにします。各ビット・フラグは、イベントの呼出しの対象となる様々なジョブ状態を表します。たとえば、最下位ビットをオンにすることで、ジョブの開始イベントを呼び出すことができます。複数の状態変化イベント・タイプを1回のコールで使用可能にするには、必要なビット・フラグの値を加算し、その結果を引数としてSET_ATTRIBUTEに提供します。 ビット・フラグのリストについては、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』のDBMS_SCHEDULER.SET_ATTRIBUTEに関する説明を参照してください。

次の例では、ジョブdw_reportsに対する複数の状態変化イベントを使用可能にします。次のイベント・タイプを使用可能にします。両方がなんらかのエラーを示しています(イベント・タイプはパッケージ内で定数として定義されます)。

スケジューラ呼出しイベントのアプリケーションでの使用

スケジューラ・イベントを使用するには、アプリケーションがスケジューラ・イベント・キューSYS.SCHEDULER$_EVENT_QUEUEをサブスクライブする必要があります。このキューはセキュアなキューであり、所有者はSYSです。あるユーザーについてこのキューのサブスクリプションを作成するには、次の処理を実行します。

  1. SYSユーザーまたはMANAGE ANY QUEUE権限のあるユーザーでデータベースにログインします。

  2. 新規または既存のエージェントを使用してキューをサブスクライブします。

  3. パッケージ・プロシージャDBMS_AQADM.ENABLE_DB_ACCESSを次のように実行します。

    DBMS_AQADM.ENABLE_DB_ACCESS(agent_name, db_username);
    
    

    agent_nameは、イベント・キューのサブスクライブに使用したエージェントを表し、db_usernameは、サブスクリプションを作成する対象のユーザーです。

ユーザーにデキュー権限を付与する必要はありません。スケジューラ・イベント・キューに関するデキュー権限は、PUBLICに付与されます。

または、次の例に示すように、ユーザーがADD_EVENT_QUEUE_SUBSCRIBERプロシージャを使用してスケジューラ・イベント・キューをサブスクライブすることもできます。

DBMS_SCHEDULER.ADD_EVENT_QUEUE_SUBSCRIBER(subscriber_name);

この例では、subscriber_nameは、スケジューラ・イベント・キューのサブスクライブに使用されるOracle Streamsアドバンスト・キューイング(AQ)エージェントの名前です(NULLの場合は、呼出しユーザーのユーザー名でエージェントが作成されます)。このコールによって、スケジューラ・イベント・キューのサブスクリプションが作成され、指定エージェントを使用してデキューする許可がユーザーに付与されます。サブスクリプションはルールベースです。ルールによって、ユーザーが許可されるのは、所有するジョブが呼び出したイベントの参照のみで、その他のメッセージはすべて除外されます。サブスクリプションが使用可能になると、ユーザーは一定の間隔でメッセージをポーリングするか、またはメッセージが通知されるようにAQに登録できます。

詳細は、『Oracle Streamsアドバンスト・キューイング・ユーザーズ・ガイドおよびリファレンス』を参照してください。

スケジューラ・イベント・キュー

スケジューラ・イベント・キューSYS.SCHEDULER$_EVENT_QUEUEのタイプはscheduler$_event_infoです。次に、このタイプの詳細を示します。

create or replace type sys.scheduler$_event_info as object
(
  event_type         VARCHAR2(4000),
  object_owner       VARCHAR2(4000),
  object_name        VARCHAR2(4000),
  event_timestamp    TIMESTAMP WITH TIME ZONE,
  error_code         NUMBER,
  error_msg          VARCHAR2(4000),
  event_status       NUMBER,
  log_id             NUMBER,
  run_count          NUMBER,
  failure_count      NUMBER,
  retry_count        NUMBER,
  spare1             NUMBER,
  spare2             NUMBER,
  spare3             VARCHAR2(4000),
  spare4             VARCHAR2(4000),
  spare5             TIMESTAMP WITH TIME ZONE,
  spare6             TIMESTAMP WITH TIME ZONE,
  spare7             RAW(2000),
  spare8             RAW(2000),
);

属性  説明 

event_type 

"JOB_STARTED"、"JOB_SUCCEEDED"、"JOB_FAILED"、"JOB_BROKEN"、"JOB_COMPLETED"、"JOB_STOPPED"、"JOB_SCH_LIM_REACHED"、"JOB_DISABLED"、"JOB_CHAIN_STALLED"、"JOB_OVER_MAX_DUR"のいずれか。

これらのイベント・タイプの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』のSET_ATTRIBUTEプロシージャに関する項を参照してください。 

object_owner 

イベントを呼び出したジョブの所有者。 

object_name 

イベントを呼び出したジョブの名前。 

event_timestamp 

イベントが発生した時刻。 

error_code 

ジョブ実行時にエラーが発生した場合にのみ使用可能です。トップレベルのエラー・コードが格納されます。 

error_msg 

ジョブ実行時にエラーが発生した場合にのみ使用可能です。エラー・スタック全体が格納されます。 

event_status 

イベント・タイプにさらに規定を追加します。event_typeが"JOB_STARTED"の場合、ステータス1は通常の開始であり、ステータス2は再試行であることを示します。

event_typeが"JOB_FAILED"の場合、ステータス4はジョブ実行中に発生したエラーによる失敗であり、ステータス8はなんからの異常終了であることを示します。

event_typeが"JOB_STOPPED"の場合、ステータス16は正常な終了であり、ステータス32はFORCEオプションがTRUEに設定された終了であることを示します。 

log_id 

スケジューラ・ジョブ・ログ内のIDを指し示します。このログから追加情報を取得できます。イベントに対応するログ・エントリが必ず存在するとはかぎらないことに注意してください。エントリが存在しない場合、log_idNULLです。 

run_count 

イベントが呼び出されたときのジョブの実行回数。 

failure_count 

イベントが呼び出されたときのジョブの失敗回数。 

retry_count 

イベントが呼び出されたときのジョブの再試行回数。 

spare1 - spare8 

現在は実装されていません。 

アプリケーションによって呼び出されるイベントの使用

アプリケーションで、ジョブを開始するようにスケジューラに通知するイベントを呼び出すことができます。この方法で開始されるジョブは、イベントベースのジョブと呼ばれます。オプションで、ジョブはイベントのメッセージ内容を取得できます。

イベントベースのジョブを作成するには、次の2つの追加属性を設定する必要があります。

queue_specおよびevent_conditionは、インラインのジョブ属性として指定するか、またはこれらの属性を指定したイベント・スケジュールを作成し、ジョブからこのスケジュールを指し示すことができます。


注意

スケジューラは、event_conditionと一致するイベントの発生ごとにイベントベースのジョブを実行します。ただし、ジョブの実行中に発生したイベントは無視されます。イベントは使用されますが、ジョブの別の実行はトリガーされません。 


表27-8に、アプリケーションによって呼び出される(スケジューラによって使用される)イベントに関する一般的な管理タスクとそれに対応するプロシージャを示します。

表 27-8    アプリケーションによって呼び出されるイベントに対するイベント・タスクとそのプロシージャ 
タスク  プロシージャ  必要な権限 

イベントベースのジョブの作成 

CREATE_JOB 

CREATE JOBまたはCREATE ANY JOB 

イベントベースのジョブの変更 

SET_ATTRIBUTE 

CREATE ANY JOB、あるいは変更対象のジョブの所有権またはそのジョブに対するALTER権限 

イベント・スケジュールの作成 

CREATE_EVENT_SCHEDULE 

CREATE JOBまたはCREATE ANY JOB 

イベント・スケジュールの変更 

SET_ATTRIBUTE 

CREATE ANY JOB、あるいは変更対象のスケジュールの所有権またはそのスケジュールに対するALTER権限 

関連項目

キューの作成およびメッセージのエンキュー方法については、『Oracle Streamsアドバンスト・キューイング・ユーザーズ・ガイドおよびリファレンス』を参照してください。 

イベントベースのジョブの作成

イベントベースのジョブを作成するには、CREATE_JOBプロシージャまたはEnterprise Managerを使用します。ジョブには、ジョブ属性としてイベント情報をインラインで組み込むか、またはイベント・スケジュールを指し示してイベント情報を指定できます。

時間スケジュールに基づくジョブと同様に、イベントベースのジョブは、ジョブ終了日をすぎるか、max_runsまたは最大失敗回数(max_failures)に達するまでは自動削除されません。

イベント情報をジョブ属性として指定する方法

イベント情報をジョブ属性として指定するには、CREATE_JOBの代替構文を使用して、queue_specおよびevent_condition属性を組み込みます。

次の例では、データ・センターに入るために誰かがバッジを使用した場合に開始するジョブが作成されます。

BEGIN
DBMS_SCHEDULER.CREATE_JOB (
   job_name            =>  'my_job',
   program_name        =>  'my_program',
   event_condition     =>  'tab.user_data.event_type = ''CARD_SWIPE''',
   queue_spec          =>  'entry_events_q, entry_agent1',
   enabled             =>  TRUE,
   comments            =>  'Start job when someone swipes a badge');
END;
/

CREATE_JOBプロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

イベント情報をイベント・スケジュールで指定する方法

イベント情報をイベント・スケジュールで指定するには、ジョブのschedule_name属性にイベント・スケジュールの名前を設定する必要があります。次に例を示します。

BEGIN
DBMS_SCHEDULER.CREATE_JOB (
   job_name            =>  'my_job',
   program_name        =>  'my_program',
   schedule_name       =>  'entry_events_schedule',
   enabled             =>  TRUE,
   comments            =>  'Start job when someone swipes a badge');
END;
/

詳細は、「イベント・スケジュールの作成」を参照してください。

イベントベースのジョブの変更

イベントベースのジョブを変更するには、SET_ATTRIBUTEプロシージャを使用します。イベントをインラインで指定するジョブの場合、SET_ATTRIBUTEを使用してqueue_spec属性とevent_condition属性を別々に設定することはできません。かわりに、event_specと呼ばれる属性を設定し、イベント条件とキュー仕様を3番目と4番目の引数としてSET_ATTRIBUTEに渡す必要があります。

次は、event_spec属性の使用例です。

BEGIN
DBMS_SCHEDULER.SET_ATTRIBUTE ('my_job', 'event_spec', 
   'tab.user_data.event_type = ''BAD_BADGE''', 'entry_events_q, entry_agent1');
END;
/

SET_ATTRIBUTEプロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

イベント・スケジュールの作成

イベントに基づいたスケジュールを作成できます。作成したスケジュールは、複数のジョブに再利用できます。この実行には、CREATE_EVENT_SCHEDULEプロシージャまたはEnterprise Managerを使用します。次は、イベント・スケジュールの作成例です。

BEGIN
DBMS_SCHEDULER.CREATE_EVENT_SCHEDULE (
   schedule_name     =>  'entry_events_schedule',
   start_date        =>  SYSTIMESTAMP,
   event_condition   =>  'tab.user_data.event_type = ''CARD_SWIPE''', 
   queue_spec        =>  'entry_events_q, entry_agent1');
END;
/

イベント・スケジュールを削除するには、DROP_SCHEDULEプロシージャを使用します。 CREATE_EVENT_SCHEDULEの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

イベント・スケジュールの変更

イベント・スケジュールのイベント情報を変更する方法は、ジョブのイベント情報を変更する方法と同じです。 詳細は、「イベントベースのジョブの変更」を参照してください。

次の例は、イベント・スケジュールのイベント情報を変更するためのSET_ATTRIBUTEプロシージャおよびevent_spec属性の使用方法を示しています。

BEGIN
DBMS_SCHEDULER.SET_ATTRIBUTE ('entry_events_schedule', 'event_spec',
   'tab.user_data.event_type = ''BAD_BADGE''', 'entry_events_q, entry_agent1');
END;
/

SET_ATTRIBUTEプロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

イベントベースのジョブにイベント・メッセージを渡す方法

メタデータの引数を介して、スケジューラは、イベントベースのジョブに対して、ジョブを開始したイベントのメッセージ内容を渡すことができます。次の規則が適用されます。

EVENT_MESSAGEメタデータ引数があるジョブをRUN_JOBプロシージャを使用して手動で実行した場合、その引数に渡される値はNULLです。

次の例は、イベント・メッセージの内容を受け取ることができるイベントベースのジョブを作成する方法を示しています。

create or replace procedure my_stored_proc (event_msg IN event_queue_type)
as
begin
  -- retrieve and process message body
  -- do other work
end;
/ 
 
begin
  dbms_scheduler.create_program (
      program_name => 'my_prog',
      program_action=> 'my_stored_proc',
      program_type => 'STORED_PROCEDURE',
      number_of_arguments => 1,
      enabled => FALSE) ;
 
  dbms_scheduler.define_metadata_argument (
      program_name => 'my_prog',
      argument_position => 1 ,
      metadata_attribute => 'EVENT_MESSAGE') ;
 
  dbms_scheduler.enable ('my_prog');
exception
  when others then raise ;
end ;
/
 
begin
  dbms_scheduler.create_job (
     job_name => 'my_evt_job' ,
     program_name => 'my_prog',
     schedule_name => 'my_evt_sch',
     enabled => true,
     auto_Drop => false) ;
exception
  when others then raise ;
end ;
/

チェーンの使用

チェーンは、結合した1つの目的のために互いにリンクされた一連の名前付きプログラムです。チェーンを作成および使用するには、次のステップを実行します。

ステップ  参照先 

1. チェーン・オブジェクトを作成します。 

チェーンの作成 

2. チェーン内のステップを定義します。 

チェーン・ステップの定義 

3. ルールを追加します。 

チェーンへのルールの追加 

4. チェーンを使用可能にします。 

チェーンの使用可能化 

5. チェーンを指し示すジョブを作成します。 

チェーン用のジョブの作成 

この項で説明する他の内容は、次のとおりです。

チェーンのタスクとそのプロシージャ

表27-9に、チェーンに関する一般的なタスクとそれに対応するプロシージャを示します。

表 27-9    チェーンのタスクとそのプロシージャ 
タスク  プロシージャ  必要な権限 

チェーンの作成 

CREATE_CHAIN 

CREATE JOBCREATE EVALUATION CONTEXTおよびCREATE RULE SET(所有者の場合)。CREATE ANY JOBCREATE ANY RULE SETおよびCREATE ANY EVALUATION CONTEXT(所有者以外の場合)。 

チェーンの削除 

DROP_CHAIN 

チェーンの所有権、あるいはチェーンに対するALTER権限またはCREATE ANY JOB権限。所有者以外の場合は、DROP ANY EVALUATION CONTEXTおよびDROP ANY RULE SETも必要です。 

チェーンの変更 

ALTER_CHAIN 

チェーンの所有権、あるいはチェーンに対するALTER権限またはCREATE ANY JOB。 

チェーンの変更 

SET_ATTRIBUTE 

チェーンの所有権、あるいはチェーンに対するALTER権限またはCREATE ANY JOB。 

実行中チェーンの変更 

ALTER_RUNNING_CHAIN 

ジョブの所有権、あるいはジョブに対するALTER権限またはCREATE ANY JOB。 

チェーンの実行 

RUN_CHAIN 

CREATE JOBまたはCREATE ANY JOB。また、新規ジョブの所有者には、チェーンに対するEXECUTE権限またはEXECUTE ANY PROGRAMが必要です。 

チェーンへのルールの追加 

DEFINE_CHAIN_RULE 

チェーンの所有権、あるいはチェーンに対するALTER権限またはCREATE ANY JOB権限。CREATE RULE(チェーンの所有者の場合)、CREATE ANY RULE(チェーンの所有者以外の場合)。 

チェーン内のルールの変更 

DEFINE_CHAIN_RULE 

チェーンの所有権、あるいはチェーンに対するALTER権限またはCREATE ANY JOB権限。チェーンの所有者以外の場合は、そのルールに対するALTER権限またはALTER ANY RULEが必要です。 

チェーンからのルールの削除 

DROP_CHAIN_RULE 

チェーンの所有権、あるいはチェーンに対するALTER権限またはCREATE ANY JOB権限。DROP ANY RULE(チェーンの所有者以外の場合)。 

チェーンの使用可能化 

ENABLE 

チェーンの所有権、あるいはチェーンに対するALTER権限またはCREATE ANY JOB。 

チェーンの使用禁止 

DISABLE 

チェーンの所有権、あるいはチェーンに対するALTER権限またはCREATE ANY JOB。 

ステップの作成 

DEFINE_CHAIN_STEP 

チェーンの所有権、あるいはチェーンに対するALTER権限またはCREATE ANY JOB。 

ステップの削除 

DROP_CHAIN_STEP 

チェーンの所有権、あるいはチェーンに対するALTER権限またはCREATE ANY JOB。 

ステップの変更 

DEFINE_CHAIN_STEP 

チェーンの所有権、あるいはチェーンに対するALTER権限またはCREATE ANY JOB。 

チェーンの作成

チェーンを作成するには、CREATE_CHAINプロシージャを使用します。CREATE_CHAINを使用してチェーン・オブジェクトを作成した後、チェーン・ステップおよびチェーン・ルールを別々に定義します。

rule_set_nameおよびevaluation_interval引数は通常NULLのままです。evaluation_intervalでは、ジョブの開始時またはステップの完了時以外にチェーン・ルールが評価される時期を定義できます。rule_set_nameは上級ユーザー用です。

CREATE_CHAINの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

次は、チェーンの作成例です。

BEGIN
DBMS_SCHEDULER.CREATE_CHAIN (
   chain_name          => 'my_chain1',
   rule_set_name       => NULL,
   evaluation_interval => NULL,
   comments            => 'My first chain');
END;
/

チェーン・ステップの定義

チェーン・オブジェクトの作成後、1つ以上のチェーン・ステップを定義します。各ステップは、次のいずれかを指し示すことができます。

プログラムまたはネストしたチェーンを指し示すステップを定義するには、DEFINE_CHAIN_STEPプロシージャを使用します。次に、my_chain1に2つのステップを追加する例を示します。

BEGIN
DBMS_SCHEDULER.DEFINE_CHAIN_STEP (
   chain_name      =>  'my_chain1',
   step_name       =>  'my_step1',
   program_name    =>  'my_program1');
DBMS_SCHEDULER.DEFINE_CHAIN_STEP (
   chain_name      =>  'my_chain1',
   step_name       =>  'my_step2',
   program_name    =>  'my_chain2');
END;
/

イベントの発生を待機するステップを定義するには、DEFINE_CHAIN_EVENT_STEPプロシージャを使用します。プロシージャの引数で、イベント・スケジュールを指し示すか、またはインラインのキュー仕様とイベント条件を組み込むことができます。この例では、名前付きイベント・スケジュールで指定されたイベントを待機する3番目のチェーン・ステップが作成されます。

BEGIN
DBMS_SCHEDULER.DEFINE_CHAIN_EVENT_STEP (
   chain_name           =>  'my_chain1',
   step_name            =>  'my_step3',
   event_schedule_name  =>  'my_event_schedule');
END;
/

DEFINE_CHAIN_STEPおよびDEFINE_CHAIN_EVENT_STEPプロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

チェーンへのルールの追加

チェーン・ルールでは、ステップの実行時期、およびステップ間の依存関係が定義されます。各ルールには条件と処理があります。条件がTRUEに評価された場合に処理が実行されます。条件では、スケジューラ・チェーン条件の構文、またはSQLのWHERE句で有効な構文を使用できます。この構文には、ステップの完了ステータスなど、チェーン・ステップの属性への参照を組み込むことができます。標準的な処理は、指定したステップを実行することです。

条件は通常、1つ以上の先行するステップの結果に基づきます。たとえば、先行する2つのステップが成功した場合はあるステップを実行し、2つのステップのいずれかが失敗した場合には別のステップを実行する場合があります。

チェーンに追加されるルールはすべてまとまって機能し、チェーンの動作全体を定義します。ジョブの開始時および各ステップの終了時に、次に実行される処理を判断するためにすべてのルールが評価されます。(ルールが一定の間隔で評価されるように設定することもできます。 詳細は、「チェーンの作成」を参照してください。)

チェーンにルールを追加するには、DEFINE_CHAIN_RULEプロシージャを使用します。このプロシージャは、チェーンに追加する各ルールに対して1回ずつコールします。

チェーンの開始

ジョブの開始時にチェーンを開始できるように、少なくとも1つのルールに、常にTRUEに評価される条件が必要です。このための最も簡単な方法は、スケジュール・チェーン条件の構文を使用している場合は条件を'TRUE'に設定すること、またはSQL構文を使用している場合は条件を'1=1'に設定することです。

チェーンの終了

少なくとも1つのチェーン・ルールに、'END'のactionが含まれている必要があります。チェーン・ジョブは、END処理が含まれているルールの1つがTRUEに評価されるまでは完了しません。通常は、異なるEND処理が設定された別々のルールがあり、エラー・コードを伴う場合と伴わない場合があります。

チェーンに実行するステップがなくなるか、またはイベントの発生の待機中ではなく、END処理が含まれているルールでTRUEに評価されるルールがない(またはEND処理が設定されているルールがない)場合、ジョブの状態はCHAIN_STALLEDになります。 詳細は、「停止状態チェーンの処理」を参照してください。

次の例では、ステップ1でチェーンを開始するルール、ステップ1の完了時にステップ2を開始するルールが定義されます。rule_nameおよびcommentsはオプションであり、デフォルトでNULLに設定されます。

BEGIN
DBMS_SCHEDULER.DEFINE_CHAIN_RULE (
   chain_name   =>   'my_chain1',
   condition    =>   'TRUE',
   action       =>   'START step1',
   rule_name    =>   'my_rule1',
   comments     =>   'start the chain');
DBMS_SCHEDULER.DEFINE_CHAIN_RULE (
   chain_name   =>   'my_chain1',
   condition    =>   'step1 completed',
   action       =>   'START step2',
   rule_name    =>   'my_rule2');
END;
/

関連項目

  • DEFINE_CHAIN_RULEプロシージャおよびスケジューラ・チェーン条件の構文の詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

  • 「チェーンの作成例」

 

チェーンの使用可能化

チェーンを使用可能にするには、ENABLEプロシージャを使用します。ジョブでチェーンを実行するには、チェーンを使用可能にする必要があります。すでに使用可能のチェーンを使用可能にしてもエラーは戻されません。

次の例では、チェーンmy_chain1が使用可能になります。

BEGIN
DBMS_SCHEDULER.ENABLE ('my_chain1');
END;
/

ENABLEプロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。


注意

チェーンは、次の場合にスケジューラによって自動的に使用禁止にされます。

  • いずれかのチェーン・ステップが指し示しているプログラムが削除されている場合

  • いずれかのチェーン・ステップが指し示しているネストしたチェーンが削除されている場合

  • いずれかのチェーン・イベント・ステップが指し示しているイベント・スケジュールが削除されている場合

 

チェーン用のジョブの作成

チェーンを実行するには、RUN_CHAINプロシージャを使用するか、タイプ'CHAIN'のジョブを作成する必要があります。ジョブの処理では、次の例に示すように、チェーン名を参照する必要があります。

BEGIN
DBMS_SCHEDULER.CREATE_JOB (
   job_name        => 'chain_job_1',
   job_type        => 'CHAIN',
   job_action      => 'my_chain1',
   repeat_interval => 'freq=daily;byhour=13;byminute=0;bysecond=0',
   enabled         => TRUE);
END;
/

実行中のチェーン・ジョブの各ステップには、スケジューラによって、チェーン・ジョブと同じジョブ名と所有者を設定したステップ・ジョブが作成されます。各ステップ・ジョブにはさらに、そのジョブを一意に識別するためのサブ名があります。ジョブのサブ名は、ビュー*_SCHEDULER_RUNNING_JOBS*_SCHEDULER_JOB_LOGおよび*_SCHEDULER_JOB_RUN_DETAILSに列として組み込まれます。また、次の場合を除いて、ジョブのサブ名は通常はステップ名と同じです。

チェーンの削除

チェーンをステップとルールも含めて削除するには、DROP_CHAINプロシージャを使用します。次に、チェーンを削除する例を示します。この例では、my_chain1が削除されます。

BEGIN
DBMS_SCHEDULER.DROP_CHAIN (
   chain_name   => 'my_chain1',
   force        => TRUE);
END;
/

DROP_CHAINプロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

チェーンの実行

RUN_CHAINプロシージャを使用すると、チェーンに対するジョブをあらかじめ作成することなく、チェーンを即時に実行できます。また、RUN_CHAINを使用してチェーンの一部のみを実行することもできます。

RUN_CHAINでは、指定したチェーンを実行する一時ジョブが作成されます。ジョブ名を指定した場合は、その名前でジョブが作成されます。指定しない場合は、デフォルトのジョブ名が割り当てられます。

開始ステップ・リストを指定すると、チェーンの実行開始時にそれらのステップのみが開始されます(通常開始されるステップは、それらがリスト内にない場合は実行されません)。開始ステップのリストが提供されない場合は、チェーンが通常どおり開始されます。つまり、初期評価が行われ、実行を開始するステップが判断されます。次に、チェーンmy_chain1を即時に実行する例を示します。

BEGIN
DBMS_SCHEDULER.RUN_CHAIN (
   chain_name    =>  'my_chain1',
   job_name      =>  'quick_chain_job',
   start_steps   =>  'my_step1, my_step2');
END;
/

RUN_CHAINプロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

チェーンからのルールの削除

チェーンからルールを削除するには、DROP_CHAIN_RULEプロシージャを使用します。次に、my_rule1を削除する例を示します。

BEGIN
DBMS_SCHEDULER.DROP_CHAIN_RULE (
   chain_name   =>   'my_chain1',
   rule_name    =>   'my_rule1',
   force        =>   TRUE);
END;
/

DROP_CHAIN_RULEプロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

チェーンの使用禁止

チェーンを使用禁止にするには、DISABLEプロシージャを使用します。次に、my_chain1を使用禁止にする例を示します。

BEGIN
DBMS_SCHEDULER.DISABLE ('my_chain1');
END;
/

DISABLEプロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。


注意

チェーンは、次の場合にスケジューラによって自動的に使用禁止にされます。

  • いずれかのチェーン・ステップが指し示しているプログラムが削除されている場合

  • いずれかのチェーン・ステップが指し示しているネストしたチェーンが削除されている場合

  • いずれかのチェーン・イベント・ステップが指し示しているイベント・スケジュールが削除されている場合

 

チェーン・ステップの削除

チェーンからステップを削除するには、DROP_CHAIN_STEPプロシージャを使用します。次に、my_chain2からmy_step2を削除する例を示します。

BEGIN
DBMS_SCHEDULER.DROP_CHAIN_STEP (
   chain_name   =>   'my_chain2',
   step_name    =>   'my_step2',
   force        =>    TRUE);
END;
/

DROP_CHAIN_STEPプロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

チェーン・ステップの変更

チェーン・ステップのSKIPPAUSEまたはRESTART_ON_RECOVERY属性を変更するには、ALTER_CHAINプロシージャを使用します。次に、my_step3をスキップするように設定する例を示します。

BEGIN
DBMS_SCHEDULE.ALTER_CHAIN (
   chain_name  =>  'my_chain1',
   step_name   =>  'my_step3',
   attribute   =>  'SKIP',
   value       =>  TRUE);
END;
/

ALTER_CHAINプロシージャは、指定したステップの次回以降の実行にのみ影響を与えます。

実行中のチェーンのステップを変更するには、ALTER_RUNNING_CHAINプロシージャを使用します。次の例では、ステップmy_step1が完了後に一時停止されるように設定されます。つまり、状態がPAUSEDに変更され、そのcompleted属性はFALSEのままになります。

BEGIN
DBMS_SCHEDULER.ALTER_RUNNING_CHAIN (
   job_name     =>   'my_job1',
   step_name    =>   'my_step1',
   attribute    =>   'PAUSE',
   value        =>    TRUE);
END;
/

ALTER_RUNNING_CHAINプロシージャは、チェーンの実行中のインスタンスにのみ影響を与えます。

ALTER_CHAINプロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

停止状態チェーンの処理

チェーンは、実行中のステップがなく、実行をスケジュールされているステップがなく、イベント待機中のイベント・ステップがなく、チェーンのevaluation_intervalがNULLである場合は、停止状態になります。このチェーンは、ユーザーが手動で操作しないかぎり、先の処理に進むことができません。この場合、チェーンを実行しているジョブの状態はCHAIN_STALLEDに設定されます(ただし、ジョブは*_SCHEDULER_RUNNING_JOBSビューにリストされたままです)。

停止状態のチェーンの問題を解決するには、ビューALL_SCHEDULER_RUNNING_CHAINS(チェーン(ネストしたチェーンを含む)内のすべてのステップの状態が示されます)とビューALL_SCHEDULER_CHAIN_RULES(すべてのチェーン・ルールが含まれます)が使用されます。

ALTER_RUNNING_CHAINプロシージャを使用していずれかのステップのstateを変更すると、チェーンの実行を継続できます。たとえば、ステップ11がステップ9の正常終了まで待機してから開始するようになっており、状態の変更がこれに関係する場合、ステップ9のstateを'SUCCEEDED'に設定することもできます。

あるいは、1つ以上のルールが正しくない場合は、DEFINE_CHAIN_RULEプロシージャを使用して、(同じルール名を使用して)それらのルールを置換するか、または新規ルールを作成できます。新規および更新したルールは、実行中のチェーンと次回以降のすべてのチェーン実行に適用されます。ルールの追加または更新後は、停止状態のチェーン・ジョブでEVALUATE_RUNNING_CHAINを実行し、必要な処理をトリガーする必要があります。

ジョブ間のリソースの割当て

個々のジョブ・レベルでリソース割当てを管理するのは実用的ではないため、スケジューラでは、ジョブ間のリソース割当ての管理にジョブ・クラスの概念が使用されます。ジョブ・クラスの他に、Resource Managerも使用されます。

Resource Managerを使用したジョブ間のリソース割当て

Resource Managerは、データベースでのリソース割当て方法を制御するデータベース機能です。ジョブなどの非同期セッションのみでなく、ユーザー・セッションなどの同期セッションも制御します。データベース内のすべての作業単位をリソース・コンシューマ・グループにグループ化し、リソース・プランを使用して、様々なグループ間のリソース割当て方法を指定します。Resource Managerで制御されるリソースの種類の詳細は、第24章「データベース・リソース・マネージャの使用」を参照してください。

ジョブに対するリソース割当ては、ジョブ・クラスをコンシューマ・グループと関連付けるか、またはジョブ・クラスをデータベース・サービス名と関連付け、そのデータベース・サービスをコンシューマ・グループにマッピングすることによって指定します。ジョブ・クラスのマッピング先となるコンシューマ・グループは、ジョブ・クラスの作成時に指定できます。ジョブ・クラスの作成時にリソース・コンシューマ・グループまたはデータベース・サービス名が指定されていない場合、ジョブ・クラスはデフォルトのコンシューマ・グループにマッピングされます。

スケジューラは、完了に必要なリソースを確保できないまま同時に多数のジョブを実行するかわりに、少なくとも一部のジョブを完了できるように、同時に実行するジョブの数を制限しようとします。

スケジューラとResource Managerは緊密に統合されています。ジョブ・コーディネータは、データベース・リソースの可用性をResource Managerから取得します。この情報に基づいて、コーディネータは開始するジョブの数を判断します。実行するための十分なリソースがあるジョブ・クラスのジョブのみを開始します。コーディネータは、コンシューマ・グループにマッピングされている特定ジョブ・クラス内のジョブを開始し続けます。これは、そのコンシューマ・グループに割り当てられているリソースが最大に達したとResource Managerが判断するまで続きます。つまり、実行準備が整っていても、実行に必要なリソースがないためにジョブ・コーディネータによって取り出されないジョブがジョブ表内に存在する可能性があります。したがって、スケジュールされた正確な時間にジョブが実行されることは保証されません。コーディネータは、どのコンシューマ・グループに使用可能なリソースがまだあるかを基準にして、ジョブ表からジョブを取り出します。

ジョブが実行中の場合でも、Resource Managerは、指定したリソース・プランに基づいて実行中の各ジョブに割り当てられたCPUサイクル量の管理を続けます。Resource Managerが管理できるのはデータベースのプロセスのみであることに注意してください。CPUサイクルのアクティブな管理は、タイプがexecutableのジョブには適用されません。

1つのデータベースで一度に有効にできるリソース・プランは1つのみです。DBMS_RESOURCE_MANAGER.SWITCH_PLANプロシージャを使用すると、システム上のアクティブなリソース・プランを手動で切り替えることができます。特別な場合は、特定のリソース・プランを実行し、ウィンドウのオープンによるリソース・プランの切替えを無効にすることもできます。これを実行するために、allow_scheduler_plan_switchesFALSEに設定してDBMS_RESOURCE_MANAGER.SWITCH_PLANプロシージャを使用できます。

Real Application Clusters環境では、同じリソース・プランがすべてのデータベース・インスタンスで有効になります。

ジョブに対するリソース割当ての例

次の例では、ジョブに対するリソースの割当て方法について説明します。「夜間プラン」というアクティブなリソース・プランがあり、3つのジョブ・クラスがあるとします。JC1はコンシューマ・グループDWに、JC2はコンシューマ・グループOLTPに、JC3はデフォルトのコンシューマ・グループにそれぞれマッピングされています。図27-3に、この例を簡単な図で示します。

図 27-3    リソース・プランの例


画像の説明

このリソース・プランでは、ジョブ・クラスJC1に属するジョブが明らかに優先されます。コンシューマ・グループDWはリソースを60%取得するため、ジョブ・クラスJC1に属するジョブはリソースを60%取得します。コンシューマ・グループOLTPはリソースを30%取得するため、ジョブ・クラスJC2内のジョブはリソースを30%取得します。コンシューマ・グループOtherでは、他のすべてのコンシューマ・グループがリソースを10%取得することが指定されます。つまり、ジョブ・クラスJC3に属するすべてのジョブが、10%のリソースを共有し、リソースを最大10%取得できます。


戻る 次へ
Oracle
Copyright © 2006 Oracle Corporation.

All Rights Reserved.
目次
目次
索引
索引