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.