sql >> Base de Datos >  >> RDS >> Oracle

Cómo programar un trabajo para que se ejecute en un momento determinado usando dbms_scheduler

create_job es la llamada básica para programar una llamada. no tiene que crear un programa o programa con nombre para hacer esto. donde es útil crear un programa/horario con nombre, es si tiene varios trabajos que desean usar esta llamada. simplemente puede hacer referencia al cronograma del programa nombrado en lugar de que cada trabajo tenga una copia de eso.

p.ej. si tuviera 5 trabajos que quisieran llamar a su paquete MYPKG.ENTRY_PROG(param) y cada trabajo solo usó un valor de parámetro diferente, diría que desea usar create_program para definir esa llamada pl/sql y luego create_job para hacer referencia a ese nombre de programa + establecer el valor de parámetro de elección. De esa manera, si desea cambiar el nombre de la API más tarde o algo así, no tiene que cambiar cinco trabajos separados para hacer esto.

Si su trabajo es solo un trabajo independiente que llama a una rutina que no será llamada por otros trabajos, entonces no tiene que usar create_program /create_schedule , solo usa create_job directamente.

un ejemplo donde usé create_program fue llamar a un arnés de prueba. mi paquete de arnés de prueba se llama pkg_test_harness.queue_tests(p_set_name in varchar2) así que tengo algunos trabajos definidos que ponen en cola varias API para que se ejecuten a las 9 a.m., 12 p.m. y 5 p.m. en lugar de definir cada llamada de trabajo por separado, simplemente llamé a create_program como:

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

y luego se definió cada "trabajo" apuntando al programa.

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

No creé un horario con nombre, ya que estos horarios son únicos para el trabajo individual.