Oracle
 sql >> Database >  >> RDS >> Oracle

Come pianificare un lavoro da eseguire in un momento particolare utilizzando dbms_scheduler

create_job è la chiamata di base per programmare una chiamata. non è necessario creare un programma o un programma con nome per farlo. dove è utile creare un programma/programma con nome, è se hai diversi lavori che vogliono usare questa chiamata. puoi semplicemente fare riferimento alla pianificazione del programma denominata invece di avere una copia di ogni lavoro.

per esempio. se avevi 5 lavori che volevano chiamare il tuo pacchetto MYPKG.ENTRY_PROG(param) e ogni lavoro ha appena utilizzato un valore di parametro diverso, direi che vuoi usare create_program per definire quella chiamata pl/sql e quindi create_job per fare riferimento a quel nome di programma + impostare il valore del parametro di scelta. in questo modo, se vuoi rinominare l'API in un secondo momento o qualcosa del genere, non devi modificare cinque processi separati per farlo.

Se il tuo lavoro è solo un lavoro autonomo che chiama una routine che non verrà chiamata da altri lavori, non devi usare create_program /create_schedule , usa semplicemente create_job direttamente.

un esempio in cui ho usato create_program doveva chiamare un cablaggio di prova. il mio pacchetto di test harness si chiama pkg_test_harness.queue_tests(p_set_name in varchar2) quindi ho definito alcuni lavori che accodano varie API da eseguire alle 9:00, 12:00 e 17:00. invece di definire ogni chiamata di lavoro separatamente, ho semplicemente chiamato create_program come:

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

e quindi ogni "lavoro" è stato definito puntando al programma.

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

non ho creato una pianificazione denominata, poiché queste pianificazioni sono uniche per il singolo lavoro.