2

これについては明確ではありません。ここで DBMS_SCHEDULER には CREATE_PROGRAM CREATE_JOB CREATE_SCHEDULE などがあります。Oracle ドキュメントを読んだ後でも、何を使用すればよいかわかりません。Oracle 側では、DBMS_SCHEDULER を使用して新しいメッセージをキューに挿入します。適切な時間に、特定の時間に実行するスケジューラを作成し、メッセージをキューにエンキューする PL/SQL ブロックを実行するプログラムを作成するか、CREATE_SCHEDULE と CREATE_PROGRAM を使用する代わりに、CREATE_JOB が両方のジョブを実行することを計画しました。 ? 私が正しく行っているかどうかを教えてください。そうでない場合は、私を修正してください。

ありがとうございました

4

1 に答える 1

4

create_job通話をスケジュールするための基本的な通話です。これを行うために名前付きのプログラムやスケジュールを作成する必要はありません。名前付きプログラム/スケジュールの作成が役立つのは、この呼び出しを使用するジョブが複数ある場合です。各ジョブにそのコピーを保持させる代わりに、名前付きのプログラム スケジュールを参照するだけで済みます。

たとえば、パッケージを呼び出したいジョブが 5 つMYPKG.ENTRY_PROG(param) あり、各ジョブが異なるパラメーター値を使用した場合create_program、その pl/sql 呼び出しを定義してから、create_jobそのプログラム名を参照し、選択したパラメーター値を設定するために使用したいと思います。 . そうすれば、後で API の名前を変更したい場合などに、これを行うために 5 つの個別のジョブを変更する必要がありません。

ジョブが、他のジョブから呼び出されないルーチンを呼び出す単なるスタンドアロン ジョブである場合は、create_program/を使用する必要はなく、直接 create_schedule使用するだけです。create_job

私が使用した 1 つの例はcreate_program、テスト ハーネスを呼び出すことでした。テスト ハーネス パッケージが呼び出されるpkg_test_harness.queue_tests(p_set_name in varchar2)ので、午前 9 時、午後 12 時、および午後 5 時に実行されるさまざまな API をキューに入れるいくつかのジョブが定義されています。create_program各ジョブ呼び出しを個別に定義する代わりに、次のように呼び出しました。

    dbms_output.put('Setting up TEST_HARNESS_ENQUEUE scheduler program...');
    dbms_scheduler.create_program(program_name        => 'TEST_HARNESS_ENQUEUE',
                                  program_type        => 'STORED_PROCEDURE',                                                          
                                  program_action      => 'pkg_test_harness.queue_tests', 
                                  number_of_arguments => 1,
                                  enabled             => false,
                                  comments            => 'Program to enqueue a set of API test for the test harness to run.');

    dbms_scheduler.define_program_argument(program_name      => 'TEST_HARNESS_ENQUEUE',
                                           argument_name     => 'p_set_name',
                                           argument_position => 1,
                                           argument_type     => 'VARCHAR2',
                                           default_value     => '');

    dbms_scheduler.enable (name => 'TEST_HARNESS_ENQUEUE');

    dbms_output.put_line('done.');

次に、各「ジョブ」がプログラムを指すように定義されました。

dbms_output.put('Setting up TEST_HARNESS_ENQUEUE_9AM scheduler job...');
dbms_scheduler.create_job(job_name        => 'TEST_HARNESS_ENQUEUE_9AM',
                          program_name    => 'TEST_HARNESS_ENQUEUE',
                          start_date      => systimestamp,
                          end_date        => null,
                          repeat_interval => 'freq=daily; byhour=9; byminute=0; bysecond=0;',
                          enabled         => true,
                          auto_drop       => false,
                          comments        => 'Job to enqueue a set of API test for the test harness to run.');

dbms_scheduler.set_job_argument_value(job_name          => 'TEST_HARNESS_ENQUEUE_9AM',
                                      argument_position => 1,
                                      argument_value    => 'DAILY_9AM');
dbms_output.put_line('done.');

dbms_output.put('Setting up TEST_HARNESS_ENQUEUE_12PM scheduler job...');
dbms_scheduler.create_job(job_name        => 'TEST_HARNESS_ENQUEUE_12PM',
                          program_name    => 'TEST_HARNESS_ENQUEUE',
                          start_date      => systimestamp,
                          end_date        => null,
                          repeat_interval => 'freq=daily; byhour=12; byminute=0; bysecond=0;',
                          enabled         => true,
                          auto_drop       => false,
                          comments        => 'Job to enqueue a set of API test for the test harness to run.');

これらのスケジュールは個々のジョブに固有であるため、名前付きスケジュールは作成しませんでした。

于 2012-12-24T10:46:59.597 に答える