Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como agendar um trabalho para ser executado em um horário específico usando dbms_scheduler


create_job é a chamada básica para agendar uma chamada. você não precisa criar um programa ou agenda nomeado para fazer isso. onde a criação de um programa/agenda nomeado é útil, é se você tiver vários trabalhos que desejam usar essa chamada. você pode apenas fazer referência ao agendamento do programa nomeado em vez de fazer com que cada trabalho mantenha uma cópia disso.

por exemplo. se você tivesse 5 trabalhos querendo chamar seu pacote MYPKG.ENTRY_PROG(param) e cada trabalho usou apenas um valor de parâmetro diferente, eu diria que você deseja usar create_program para definir essa chamada pl/sql e então create_job para fazer referência a esse nome de programa + defina o valor do parâmetro de escolha. dessa forma, se você quiser renomear a API mais tarde ou algo assim, não precisará alterar cinco jobs separados para fazer isso.

Se seu trabalho for apenas um trabalho autônomo que chama uma rotina que não será chamada por outros trabalhos, você não precisará usar create_program /create_schedule , basta usar create_job diretamente.

um exemplo em que usei create_program era chamar um arnês de teste. meu pacote de teste é chamado pkg_test_harness.queue_tests(p_set_name in varchar2) então eu tenho alguns trabalhos definidos que enfileira várias APIs para serem executadas às 9h, 12h e 17h. em vez de definir cada chamada de trabalho separadamente, apenas chamei create_program Curti:
    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 então cada "trabalho" foi definido apontando para o 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.');

não criei um agendamento nomeado, pois esses agendamentos são exclusivos para o trabalho individual.