create_job
е основното обаждане за планиране на повикване. не е необходимо да създавате наименована програма или график, за да направите това. когато създаването на именувана програма/график е полезно, е ако имате няколко работни места, които искат да използват това повикване. можете просто да препратите към посочения програмен график, вместо всяка работа да съдържа копие от него.
напр. ако сте имали 5 задачи, които искат да извикат пакета ви MYPKG.ENTRY_PROG(param)
и всяко задание просто използва различна стойност на параметър, бих казал, че искате да използвате create_program
за да дефинирате това pl/sql извикване и след това create_job
за препратка към името на тази програма + задайте стойността на параметъра по избор. по този начин, ако искате да преименувате API по-късно или нещо подобно, не е нужно да променяте пет отделни задачи, за да направите това.
Ако работата ви е самостоятелна работа, която извиква рутина, която няма да бъде извикана от други задачи, тогава не е нужно да използвате create_program
/create_schedule
, просто използвайте create_job
директно.
един пример, където използвах create_program
беше да извикам тестов сбруя. моят тестов пакет се нарича pkg_test_harness.queue_tests(p_set_name in varchar2)
така че имам дефинирани няколко задания, които поставят в опашка различни API, които да се изпълняват в 9 сутринта, 12 следобед и 17 часа. вместо да дефинирам всяко извикване на задачи поотделно, аз просто извиках create_program
като:
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.');
и след това всяка "работа" беше дефинирана, сочеща към програмата.
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.');
не създадох график с имена, тъй като тези графици са уникални за отделната работа.