Oracle
 sql >> Datenbank >  >> RDS >> Oracle

So planen Sie mit dbms_scheduler, dass eine Arbeit zu einer bestimmten Zeit ausgeführt wird

create_job ist der grundlegende Anruf, um einen Anruf zu planen. Sie müssen dazu kein benanntes Programm oder einen Zeitplan erstellen. wo das Erstellen eines benannten Programms/Zeitplans nützlich ist, wenn Sie mehrere Jobs haben, die diesen Aufruf verwenden möchten. Sie können einfach auf den benannten Programmplan verweisen, anstatt dass jeder Job eine Kopie davon enthält.

z.B. wenn Sie 5 Jobs hatten, die Ihr Paket MYPKG.ENTRY_PROG(param) aufrufen wollten und jeder Job hat einfach einen anderen Parameterwert verwendet, ich würde sagen, Sie möchten create_program verwenden um diesen pl/sql-Aufruf zu definieren und dann create_job um auf diesen Programmnamen zu verweisen + setzen Sie den gewünschten Parameterwert. Auf diese Weise müssen Sie, wenn Sie die API später umbenennen möchten oder so, nicht fünf separate Jobs ändern, um dies zu tun.

Wenn Ihr Job nur ein eigenständiger Job ist, der eine Routine aufruft, die nicht von anderen Jobs aufgerufen wird, müssen Sie create_program nicht verwenden /create_schedule , verwenden Sie einfach create_job direkt.

ein Beispiel, wo ich create_program verwendet habe war, ein Testgeschirr anzurufen. Mein Test-Harness-Paket heißt pkg_test_harness.queue_tests(p_set_name in varchar2) Daher habe ich einige Jobs definiert, die verschiedene APIs in die Warteschlange stellen, die um 9:00, 12:00 und 17:00 Uhr ausgeführt werden sollen. Anstatt jeden Job-Aufruf separat zu definieren, habe ich einfach create_program aufgerufen wie:

    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.');

und dann wurde jeder "Job" definiert, der auf das Programm zeigt.

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.');

Ich habe keinen benannten Zeitplan erstellt, da diese Zeitpläne für den einzelnen Job einzigartig sind.