| Oracle Database 管理者ガイド 10gリリース2(10.2) B19224-02 |
|
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に、ジョブの一般的なタスクとそれに対応するプロシージャおよび権限を示します。
権限に関する詳細は、「スケジューラ権限の管理方法」を参照してください。
ジョブを作成するには、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_type、job_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_date、repeat_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_JOBのuse_current_session引数をTRUEに設定してジョブを実行する場合、そのジョブのfailure_countおよびrun_countのカウントは変更されません。ただし、ジョブ・ログにはジョブの実行が反映されます。ジョブによって生成されたランタイム・エラーは、RUN_JOBの実行者に返送されます。
RUN_JOBを使用してチェーンを指し示すジョブを実行する場合は、use_current_sessionをFALSEに設定する必要があります。
ジョブは、ジョブの所有者に直接付与された権限、またはデフォルトのログイン・ロールによって間接的に付与された権限で実行されます。外部OSのロールはサポートされていません。適切な権限が付与されている場合、ユーザーは他のユーザーのスキーマ内にジョブを作成できます。したがって、ジョブの作成者と所有者は異なる場合があります。たとえば、ユーザーjimにCREATE ANY JOB権限があり、scottのスキーマ内にジョブを作成した場合、そのジョブはscottの権限で実行されます。
ジョブが作成されたセッションのNLS環境が保存され、ジョブの実行時に使用されます。ジョブが実行されるNLS環境を変更するには、別のNLS設定のセッション内にジョブを作成する必要があります。
外部ジョブは、データベースの外部で実行されるジョブです。外部ジョブはすべて、データベース管理者が外部ジョブ・サポートの構成時に決定した権限の低いゲスト・ユーザーで実行されます。実行可能ファイルは権限の低いゲスト・アカウントで実行されるため、必要なファイルとリソースに対するアクセス権限があることを確認する必要があります。すべてではありませんが、ほとんどのプラットフォームで外部ジョブがサポートされています。外部ジョブをサポートしていないプラットフォームの場合は、ジョブまたはプログラムの属性をEXECUTABLEタイプで作成または設定するとエラーになります。詳細は、使用しているオペレーティング・システム固有のマニュアルを参照してください。
外部ジョブの場合、job_typeはEXECUTABLEで指定されます(名前付きプログラムを使用している場合は、対応するprogram_typeがEXECUTABLEになります)。job_action(または名前付きプログラムを使用している場合は対応するprogram_action)は、必要な外部実行可能ファイルおよびコマンドライン引数(オプション)のオペレーティング・システム依存のフルパスです。たとえば、/usr/local/bin/perlやC:¥perl¥bin¥perlなどです。タイプEXECUTABLEのプログラムまたはジョブの引数は、CHAR、VARCHAR2またはVARCHARなどの文字列型であることが必要です。
外部ジョブが権限の低いゲスト・ユーザーで確実に実行されるようにするには、インストール後の追加手順がいくつか必要となる場合があります。インストール後の構成手順については、オペレーティング・システム固有のマニュアルを参照してください。
外部ジョブによって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パッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。
スケジューラを使用している場合、外部ジョブの実装者は、forceがFALSEに設定されたSTOP_JOBがコールされた場合に、その外部ジョブを正常にクリーン・アップするメカニズムを利用できます。UNIXでは、このメカニズムは、外部ジョブ・エージェントによって起動されたプロセスにSIGTERMシグナルを送信することによって実行されます。外部ジョブの実装者は、割込みハンドラにSIGTERMをトラップし、ジョブの実行内容をすべてクリーン・アップし、終了する必要があります。Windowsでは、forceがFALSEに設定された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をコール)、その後ジョブが削除されます。 デフォルトでは、forceはFALSEに設定されています。
たとえば、次の文では、ジョブjob1とjob3、およびジョブ・クラスjobclass1とjobclass2内のすべてのジョブが削除されます。
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を使用します。ジョブは他の理由で使用禁止になる場合もあります。たとえば、ジョブが属しているジョブ・クラスが削除されると、ジョブは使用禁止になります。また、ジョブが指し示しているプログラムまたはスケジュールのいずれかが削除された場合も使用禁止になります。ジョブが指し示しているプログラムまたはスケジュールが使用禁止の場合は、そのジョブ自体は使用禁止にならないため、スケジューラがジョブを実行しようとしたときに、エラーとなることに注意してください。
ジョブを使用禁止にすると、そのジョブのメタデータはそのまま存在しますが、ジョブ自体は実行対象ではないため、ジョブ・コーディネータがこれらのジョブを取り出して処理することはありません。ジョブが使用禁止になると、ジョブ表内のそのstateはdisabledに変更されます。
forceオプションをFALSEに設定してジョブを使用禁止にすると、ジョブが現在実行中の場合はエラーが返されます。forceがTRUEに設定されているときは、ジョブは使用禁止になりますが、現在実行中のインスタンスは完了できます。
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に、プログラムの一般的なタスクとそれに対応するプロシージャおよび権限を示します。
権限に関する詳細は、「スケジューラ権限の管理方法」を参照してください。
プログラムを作成するには、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_VALUEやSET_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プロシージャを使用して特別なメタデータ引数を定義できます。
プログラムを変更するには、Enterprise ManagerまたはDBMS_SCHEDULER.SET_ATTRIBUTEおよびDBMS_SCHEDULER.SET_ATTRIBUTE_NULLパッケージ・プロシージャを使用します。 DBMS_SCHEDULERパッケージ・プロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。
次に、Enterprise Managerを使用したプログラムの変更方法を示します。
「スケジューラのプログラム」ページが表示されます。このページには既存のプログラムが表示されます。
「プログラムの編集」ページが表示されます。
「ソース」フィールドが表示されます。このフィールドでPL/SQLコードを入力または変更します。
「プロシージャ名」フィールドが表示されます。フィールドにストアド・プロシージャ名が含まれている場合は、「プロシージャの表示」をクリックするとストアド・プロシージャを表示または編集できます。フィールドが空白の場合、またはストアド・プロシージャを変更する場合は、「プロシージャの選択」をクリックします。「プロシージャの選択」ページが表示されます。ストアド・プロシージャを選択して「選択」をクリックすると、「プログラムの編集」ページに戻ります(「プロシージャの選択」ページの使用方法に関するヘルプについては、ページ上部の「ヘルプ」をクリックしてください)。
プロシージャ名を選択すると、「プログラムの編集」ページの「引数」ヘッダーの下に、引数リストが表示されます。オプションで、1つ以上の引数のデフォルト値を入力します。
「実行可能な名前」フィールドが表示されます。実行可能ファイルのフルパスを入力します。「引数」ヘッダーの下にある引数を編集または削除するか、あるいは「行の追加」をクリックして引数を追加します。
変更したプログラムが、現在実行中のジョブで使用されている場合、そのジョブは変更操作前に定義されたプログラムで引き続き実行されます。
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に、スケジュールの一般的なタスクとその処理に使用するプロシージャを示します。
| タスク | プロシージャ | 必要な権限 |
|---|---|---|
|
スケジュールの作成 |
|
|
|
スケジュールの変更 |
|
|
|
スケジュールの削除 |
|
|
権限に関する詳細は、「スケジューラ権限の管理方法」を参照してください。
スケジュールを作成するには、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つの名前付きスケジュールJUL4、MEMおよび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式はウィンドウまたは名前付きスケジュールでは使用できません。また、日付またはタイムスタンプに評価される必要があります。これ以外に制限はないため、適切なプログラミングによって、あらゆる繰返し間隔を作成できます。次の例について考えてみます。
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_intervalがSYSTIMESTAMP + INTERVAL '30' MINUTEに設定されており、この式では30分後が戻されるためです。
カレンダ指定式とPL/SQL繰返し間隔の動作には、次のような重要な相違があります。
カレンダ指定構文を使用した場合、開始日は参照日のみです。つまり、スケジュールはこの日付から有効になります。これは、ジョブが開始日に開始されることを意味しません。
PL/SQL式を使用した場合、開始日はジョブが最初に実行を開始した実際の時間を表します。
カレンダ指定構文を使用した場合、次回のジョブ実行時期は固定されています。
PL/SQL式を使用した場合、次回のジョブ実行時期は現行ジョブ実行の実際の開始時間によって異なります。この違いを示す例を考えてみます。あるジョブを午後2時に開始し、2時間おきに繰り返すスケジュールの場合、繰返し間隔をカレンダ指定構文で指定すると、ジョブは4時、6時というように繰り返され、以降も同様に繰り返されます。PL/SQLを指定してジョブを午後2時10分に開始した場合、そのジョブは午後4時10分に繰り返されます。次のジョブが実際には4時11分に開始された場合、その次のジョブ実行は6時11分になります。
この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に、ジョブ・クラスの一般的なタスクとそれに対応するプロシージャと権限を示します。
| タスク | プロシージャ | 必要な権限 |
|---|---|---|
|
ジョブ・クラスの作成 |
|
|
|
ジョブ・クラスの変更 |
|
|
|
ジョブ・クラスの削除 |
|
|
権限に関する詳細は、「スケジューラ権限の管理方法」を参照してください。
ジョブ・クラスを作成するには、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に、ウィンドウの一般的なタスクとその処理に使用するプロシージャを示します。
権限に関する詳細は、「スケジューラ権限の管理方法」を参照してください。
ウィンドウを作成するには、Enterprise ManagerまたはDBMS_SCHEDULER.CREATE_WINDOWパッケージ・プロシージャを使用します。これらの作成方法には、一方はPL/SQLを使用し、もう一方はグラフィカル・ユーザー・インタフェースを使用すること以外に、異なる点が1つあります。パッケージ・プロシージャを使用する場合は、resource_planパラメータをNULLのままにできることです。この場合は、ウィンドウのオープン時に現行のプランが有効のままになります。詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』および「スケジューラの構成」を参照してください。
次に、Enterprise Managerを使用したウィンドウの作成方法を示します。
「スケジューラのウィンドウ」ページが表示されます。このページには既存のウィンドウが表示されます。
「ウィンドウの作成」ページが表示されます。
デフォルトのINTERNAL_PLANを使用できます。 既存のリソース・プランの内容を表示するには、「リソース・プランの表示」をクリックします。 新規リソース・プランを作成する場合は、「リソース・プランの作成」をクリックしてその手順を実行します。
「OK」をクリックし、残りのステップをスキップします。
ウィンドウを変更するには、SET_ATTRIBUTEプロシージャまたはEnterprise Managerを使用します。変更するときは、WINDOW_NAME以外のすべてのウィンドウ属性を変更できます。ウィンドウの属性は、*_SCHEDULER_WINDOWSビューで使用可能です。
ウィンドウを変更しても、アクティブなウィンドウには影響を与えません。変更は、次回ウィンドウがオープンしたときに有効になります。
すべてのウィンドウを変更できます。使用禁止のウィンドウを変更した場合は、変更した後も使用禁止のままです。使用可能なウィンドウは自動的に使用禁止になり、変更後、使用可能化プロセスで実行される妥当性チェックが成功した場合は再び使用可能になります。
SET_ATTRIBUTEプロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。また、「スケジューラの構成」を参照してください。
ウィンドウがオープンすると、スケジューラは、ウィンドウの作成時に関連付けられたリソース・プランに切り替えます。ウィンドウのオープン時に実行中のジョブがある場合、そのジョブに割り当てられているリソースはリソース・プランの切替えによって変更される場合があります。
ウィンドウをオープンする方法は、次の2通りあります。
OPEN_WINDOWプロシージャを使用した手動オープンこのプロシージャは、スケジュールとは関係なくウィンドウをオープンします。ウィンドウがオープンし、関連付けられたリソース・プランが即時に有効になります。手動でオープンできるのは、使用可能なウィンドウのみです。
OPEN_WINDOWプロシージャで、duration属性を使用して、ウィンドウがオープンしている時間の長さを指定できます。継続時間の型はINTERVAL DAY TO SECONDです。継続時間の指定がない場合、ウィンドウはそのウィンドウに保存されている通常の継続時間の間オープン状態です。
ウィンドウを手動でオープンしても、スケジュールされた通常のウィンドウの実行には影響を与えません。
手動でオープンしたウィンドウがクローズすると、その時点でオープン対象のウィンドウが他にある場合は、重複ウィンドウのルールが適用され、オープンするウィンドウが判別されます。
すでにオープンしているウィンドウがある場合でも、OPEN_WINDOWコールまたはEnterprise ManagerでforceオプションをTRUEに設定すると、ウィンドウを強制的にオープンできます。
forceオプションがTRUEに設定されているときは、その時点でオープンしているウィンドウの優先順位の方が高い場合でも、スケジューラはウィンドウを自動的にクローズします。手動でオープンしたウィンドウの継続時間中は、より優先順位の高いウィンドウが他にスケジュールされていても、スケジューラはそのウィンドウをオープンしません。すでにオープンしているウィンドウもオープンできます。この場合、ウィンドウは、OPEN_WINDOWコマンドが発行された時点から、コールで指定された継続時間の間オープンしたままになります。
この状態を示す例について考えてみます。window1が継続時間4時間で作成されたとします。現在は、オープンから2時間が経過しています。この時点でOPEN_WINDOWコールを使用してwindow1を再オープンしても、継続時間を指定しない場合、window1は、さらに4時間オープンしたままになります。これは、以前からこの継続時間で作成されているためです。継続時間に30分を指定した場合、ウィンドウは30分後にクローズします。
ウィンドウがオープンすると、ウィンドウ・ログにエントリが作成されます。
現在のリソース・プランが、ALTER SYSTEM文FORCEオプションあるいはDBMS_RESOURCE_MANAGER.SWITCH_PLANパッケージ・プロシージャのallow_scheduler_plan_switches引数FALSEを使用して、手動で切り替えられたものである場合、ウィンドウでリソース・プランの切替えに失敗する可能性があります。この場合、リソース・プランの切替え失敗がウィンドウ・ログに書き込まれます。
OPEN_WINDOWプロシージャおよびDBMS_RESOURCE_MANAGER.SWITCH_PLANプロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。
ウィンドウをクローズする方法は、次の2通りあります。
ウィンドウは作成時に定義されたスケジュールに基づいてクローズします。
CLOSE_WINDOWプロシージャを使用した手動クローズCLOSE_WINDOWプロシージャは、オープン中のウィンドウを期間終了前にクローズします。
クローズしたウィンドウは、そのウィンドウが有効ではないことを意味します。ウィンドウがクローズすると、スケジューラは、リソース・プランをそのウィンドウ期間外で有効だったリソース・プランに切り替えるか、または重複ウィンドウがある場合は別のウィンドウに切り替えます。存在しないウィンドウやオープンしていないウィンドウをクローズしようとすると、エラーが生成されます。
実行中のジョブは、そのジョブが実行されているウィンドウがクローズした場合でも、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を付ける必要があります。
ウィンドウは他の理由で使用禁止になる場合もあります。たとえば、ウィンドウはそのスケジュールの終了時に使用禁止になります。また、存在しないスケジュールをウィンドウが指し示している場合も使用禁止になります。
スケジュールとしてウィンドウが設定されているジョブがある場合、そのウィンドウは、プロシージャ・コールでforceをTRUEに設定しないかぎり、使用禁止にできません。 デフォルトでは、forceはFALSEに設定されます。ウィンドウが使用禁止の場合でも、スケジュールとしてそのウィンドウが設定されているジョブは使用禁止になりません。
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には低い優先順位が割り当てられていますが、高い優先順位のウィンドウが他に存在しないためウィンドウ1がオープンします。したがって、リソース・プラン1が有効です。
ウィンドウ1より優先順位の高いウィンドウ3がオープンします。したがって、リソース・プラン3が有効です。
ウィンドウ1は、より優先順位の高いウィンドウがオープンしたために午前6時にクローズしましたが、午前9時に、この優先順位の高いウィンドウがクローズし、ウィンドウ1には当初のスケジュールの残り時間がまだ2時間あります。ウィンドウ1は残りの2時間再びオープン状態となり、リソース・プランが有効になります。
いずれのウィンドウもオープンしていないため、デフォルトのリソース・プランが有効です。
ウィンドウ2がオープンするため、リソース・プラン2が有効です。
ウィンドウ4の優先順位はウィンドウ2と同じであるため、ウィンドウ2への割込みはありません。したがって、リソース・プラン2が有効です。
ウィンドウ4がオープンしているため、リソース・プラン4が有効です。
いずれのウィンドウもオープンしていないため、デフォルトのリソース・プランが有効です。
図27-2に、24時間スケジュールの場合のウィンドウ、リソース・プランおよび優先順位の判別方法に関する別の例を示します。
図27-2では、次の処理が発生します。
デフォルトのリソース・プランが有効です。
ウィンドウ1には低い優先順位が割り当てられていますが、高い優先順位のウィンドウが他に存在しないためウィンドウ1がオープンします。したがって、リソース・プラン1が有効です。
ウィンドウ1より優先順位の高いウィンドウ3がオープンします。ウィンドウ6は優先順位の高い別のウィンドウがすでに有効であるためオープンしません。
午前9時の時点では、ウィンドウ5またはウィンドウ1の2つが選択対象です。両方とも優先順位が低いため、残り継続時間の比率の大きさに基づいて選択されます。ウィンドウ1の総継続時間と比較して、ウィンドウ5の残り時間の比率の方が大きい状態です。たとえば、ウィンドウ1が午前11時30分まで延長された場合でも、ウィンドウ5の残り継続時間に対する比率が2/3×100%であるのに対して、ウィンドウ1は2.5/7×100%であるため比率が小さくなります。したがって、リソース・プラン5が有効になります。
ウィンドウ・グループを使用すると、1日あるいは1週間などの間に複数期間実行するジョブを簡単にスケジュールできます。ウィンドウ・グループを作成してウィンドウをグループに加え、ウィンドウ・グループ名をジョブのschedule_name属性に設定すると、ジョブがウィンドウ・グループ内のすべてのウィンドウの指定期間に実行されます。
ウィンドウ・グループはSYSスキーマに格納されます。この項では、ウィンドウ・グループの基本的なタスクについて説明します。この項の内容は、次のとおりです。
表27-6に、ウィンドウ・グループの一般的なタスクとその処理に使用するプロシージャを示します。
権限に関する詳細は、「スケジューラ権限の管理方法」を参照してください。
ウィンドウ・グループを作成するには、CREATE_WINDOW_GROUPプロシージャまたはEnterprise Managerを使用します。グループのメンバー・ウィンドウは、グループの作成時に指定するか、または後でADD_WINDOW_GROUP_MEMBERプロシージャを使用して追加できます。ウィンドウ・グループは別のウィンドウ・グループのメンバーとして設定できません。ただし、メンバーを設定しないウィンドウ・グループは作成できます。
ウィンドウ・グループを作成し、存在しないメンバー・ウィンドウを指定すると、エラーが生成され、ウィンドウ・グループは作成されません。ウィンドウがすでにウィンドウ・グループのメンバーである場合、再度追加されることはありません。
ウィンドウ・グループはSYSスキーマ内に作成されます。ウィンドウ・グループは、ウィンドウと同様に、PUBLICに対するアクセス権限付きで作成されるため、ウィンドウ・グループにアクセスするための権限は必要ありません。
次の文では、downtimeというウィンドウ・グループが作成され、2つのウィンドウ(weeknightsとweekends)が追加されます。
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つの管理タスクの要約を示します。
| タスク | プロシージャ | 必要な権限 |
|---|---|---|
|
|
|
ジョブに対するジョブの状態変化イベントを使用可能にすると、スケジューラは、メッセージをスケジューラ・イベント・キュー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に対する複数の状態変化イベントを使用可能にします。次のイベント・タイプを使用可能にします。両方がなんらかのエラーを示しています(イベント・タイプはパッケージ内で定数として定義されます)。
job_failed(ビット・フラグ値=4)
job_sch_lim_reached(ビット・フラグ値=64)
BEGIN DBMS_SCHEDULER.SET_ATTRIBUTE('dw_reports', 'raise_events', DBMS_SCHEDULER.JOB_FAILED + DBMS_SCHEDULER.JOB_SCH_LIM_REACHED); END; /
スケジューラ・イベントを使用するには、アプリケーションがスケジューラ・イベント・キューSYS.SCHEDULER$_EVENT_QUEUEをサブスクライブする必要があります。このキューはセキュアなキューであり、所有者はSYSです。あるユーザーについてこのキューのサブスクリプションを作成するには、次の処理を実行します。
SYSユーザーまたはMANAGE ANY QUEUE権限のあるユーザーでデータベースにログインします。
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), );
アプリケーションで、ジョブを開始するようにスケジューラに通知するイベントを呼び出すことができます。この方法で開始されるジョブは、イベントベースのジョブと呼ばれます。オプションで、ジョブはイベントのメッセージ内容を取得できます。
イベントベースのジョブを作成するには、次の2つの追加属性を設定する必要があります。
queue_specキュー仕様。アプリケーションがジョブ開始イベントを呼び出すためのメッセージをエンキューするキューの名前が含まれます。または、セキュアなキューの場合はキュー名の後にコンマとエージェント名が記述されます。
event_conditionメッセージ・プロパティに基づく条件式。メッセージによってジョブが開始されるにはTRUEに評価される必要があります。式には、Oracle Streamsアドバンスト・キューイング・ルールの構文を使用する必要があります。したがって、メッセージ・ペイロードがオブジェクト・タイプであり、式内のオブジェクト属性にtab.user_dataの接頭辞を付けている場合は、式にユーザー・データ・プロパティを組み込むことができます。
ルールの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』のDBMS_AQADM.ADD_SUBSCRIBERプロシージャに関する説明を参照してください。
次の例では、event_conditionが、午前0時から午前9時の間に発生するカードの読取りイベントのみを選択するように設定されます。メッセージ・ペイロードはevent_typeとevent_timestampの2つの属性を持つオブジェクトであるとします。
event_condition = 'tab.user_data.event_type = ''CARD_SWIPE'' and extract hour from tab.user_data.event_timestamp < 9'
queue_specおよびevent_conditionは、インラインのジョブ属性として指定するか、またはこれらの属性を指定したイベント・スケジュールを作成し、ジョブからこのスケジュールを指し示すことができます。
表27-8に、アプリケーションによって呼び出される(スケジューラによって使用される)イベントに関する一般的な管理タスクとそれに対応するプロシージャを示します。
イベントベースのジョブを作成するには、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パッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。
メタデータの引数を介して、スケジューラは、イベントベースのジョブに対して、ジョブを開始したイベントのメッセージ内容を渡すことができます。次の規則が適用されます。
STORED_PROCEDUREの名前付きプログラムを使用する必要があります。
metadata_attributeがEVENT_MESSAGEに設定されている必要があります。
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に、チェーンに関する一般的なタスクとそれに対応するプロシージャを示します。
チェーンを作成するには、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; /
|
関連項目
|
チェーンを使用可能にするには、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に列として組み込まれます。また、次の場合を除いて、ジョブのサブ名は通常はステップ名と同じです。
_N'を追加します。Nは整数であり、この追加によってジョブ・サブ名が一意になります。
step_name_0'に設定して、ジョブ・ログ・ビュー(*_SCHEDULER_JOB_LOGおよび*_SCHEDULER_JOB_RUN_DETAILS)にFAILEDエントリを記録します。
関連項目
チェーンをステップとルールも含めて削除するには、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パッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。
チェーン・ステップのSKIP、PAUSEまたは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で制御されるリソースの種類の詳細は、第24章「データベース・リソース・マネージャの使用」を参照してください。
ジョブに対するリソース割当ては、ジョブ・クラスをコンシューマ・グループと関連付けるか、またはジョブ・クラスをデータベース・サービス名と関連付け、そのデータベース・サービスをコンシューマ・グループにマッピングすることによって指定します。ジョブ・クラスのマッピング先となるコンシューマ・グループは、ジョブ・クラスの作成時に指定できます。ジョブ・クラスの作成時にリソース・コンシューマ・グループまたはデータベース・サービス名が指定されていない場合、ジョブ・クラスはデフォルトのコンシューマ・グループにマッピングされます。
スケジューラは、完了に必要なリソースを確保できないまま同時に多数のジョブを実行するかわりに、少なくとも一部のジョブを完了できるように、同時に実行するジョブの数を制限しようとします。
スケジューラとResource Managerは緊密に統合されています。ジョブ・コーディネータは、データベース・リソースの可用性をResource Managerから取得します。この情報に基づいて、コーディネータは開始するジョブの数を判断します。実行するための十分なリソースがあるジョブ・クラスのジョブのみを開始します。コーディネータは、コンシューマ・グループにマッピングされている特定ジョブ・クラス内のジョブを開始し続けます。これは、そのコンシューマ・グループに割り当てられているリソースが最大に達したとResource Managerが判断するまで続きます。つまり、実行準備が整っていても、実行に必要なリソースがないためにジョブ・コーディネータによって取り出されないジョブがジョブ表内に存在する可能性があります。したがって、スケジュールされた正確な時間にジョブが実行されることは保証されません。コーディネータは、どのコンシューマ・グループに使用可能なリソースがまだあるかを基準にして、ジョブ表からジョブを取り出します。
ジョブが実行中の場合でも、Resource Managerは、指定したリソース・プランに基づいて実行中の各ジョブに割り当てられたCPUサイクル量の管理を続けます。Resource Managerが管理できるのはデータベースのプロセスのみであることに注意してください。CPUサイクルのアクティブな管理は、タイプがexecutableのジョブには適用されません。
1つのデータベースで一度に有効にできるリソース・プランは1つのみです。DBMS_RESOURCE_MANAGER.SWITCH_PLANプロシージャを使用すると、システム上のアクティブなリソース・プランを手動で切り替えることができます。特別な場合は、特定のリソース・プランを実行し、ウィンドウのオープンによるリソース・プランの切替えを無効にすることもできます。これを実行するために、allow_scheduler_plan_switchesをFALSEに設定してDBMS_RESOURCE_MANAGER.SWITCH_PLANプロシージャを使用できます。
Real Application Clusters環境では、同じリソース・プランがすべてのデータベース・インスタンスで有効になります。
次の例では、ジョブに対するリソースの割当て方法について説明します。「夜間プラン」というアクティブなリソース・プランがあり、3つのジョブ・クラスがあるとします。JC1はコンシューマ・グループDWに、JC2はコンシューマ・グループOLTPに、JC3はデフォルトのコンシューマ・グループにそれぞれマッピングされています。図27-3に、この例を簡単な図で示します。
このリソース・プランでは、ジョブ・クラスJC1に属するジョブが明らかに優先されます。コンシューマ・グループDWはリソースを60%取得するため、ジョブ・クラスJC1に属するジョブはリソースを60%取得します。コンシューマ・グループOLTPはリソースを30%取得するため、ジョブ・クラスJC2内のジョブはリソースを30%取得します。コンシューマ・グループOtherでは、他のすべてのコンシューマ・グループがリソースを10%取得することが指定されます。つまり、ジョブ・クラスJC3に属するすべてのジョブが、10%のリソースを共有し、リソースを最大10%取得できます。
|
![]() Copyright © 2006 Oracle Corporation. All Rights Reserved. |
|