Планировщик заданий в Oracle - Скомпонованное задание
ОГЛАВЛЕНИЕ
Скомпонованное задание
Более развитая возможность DBMS_SCHEDULER позволяет скомпоновать задание из независимых элементов: программы и расписания. Характерная особенность в том, что оба эти элемента самостоятельны; их можно комбинировать в разных заданиях и изменять, не внося изменений в определения заданий.
Создание программы
Простой пример создания программы:
BEGIN
DBMS_SCHEDULER.CREATE_PROGRAM
( program_name => 'simple_program'
, program_type => 'STORED_PROCEDURE'
, program_action => 'updatesal'
, enabled => TRUE
);
END;
/
Список сведений об имеющихся программах для планировщика имеется в таблицах DBA/ALL/USER_SCHEDULER_PROGRAMS.
Другими значениями параметра PROGRAM_TYPE могут быть 'PLSQL_BLOCK' и 'EXECUTABLE' (см. выше).
При наличии у процедуры параметров их количество потребуется указать особо:
CREATE PROCEDURE salary ( decr NUMBER ) AS
BEGIN UPDATE emp SET sal = sal - decr;
END;
/
BEGIN
DBMS_SCHEDULER.CREATE_PROGRAM
( program_name => 'simple_program1'
, program_type => 'STORED_PROCEDURE'
, program_action => 'salary'
, enabled => FALSE
, number_of_arguments => 1
);
END;
/
Обратите внимание, что программа создана «отключенной». Дело в том, что указать фактические значения параметрам программе во «включенном» состоянии нельзя, так что последовательность действий будет следующая:
BEGIN
DBMS_SCHEDULER.DEFINE_PROGRAM_ARGUMENT
( program_name => 'simple_program1'
, argument_position => 1
, argument_name => 'DELTA'
, argument_type => 'NUMBER'
);
END;
/
EXECUTE DBMS_SCHEDULER.ENABLE ( 'simple_program1' )
Создание расписания
Пример создания расписания:
BEGIN
DBMS_SCHEDULER.CREATE_SCHEDULE
( schedule_name => 'simple_schedule'
, start_date => SYSTIMESTAMP
, repeat_interval => 'FREQ=WEEKLY; BYDAY=MON, TUE, WED, THU, FRI'
, end_date => SYSTIMESTAMP + INTERVAL '1' MONTH
);
END;
/
В общем случае язык указания графика для расписания (параметр REPEAT_INTERVAL) допускает ссылаться на ранее созданные таким же образом расписания.
Список сведений об имеющихся расписаниях для планировщика имеется в таблицах DBA/ALL/USER_SCHEDULER_SCHEDULES.
Простой пример скомпонованного задания
Из самостоятельно существующих программы и расписания можно составить задание:
BEGIN
DBMS_SCHEDULER.CREATE_JOB
( job_name => 'compound_job'
, program_name => 'simple_program'
, schedule_name => 'simple_schedule'
, enabled => TRUE
);
END;
/
При наличии параметра пример может выглядеть так:
BEGIN
DBMS_SCHEDULER.CREATE_JOB
( job_name => 'compound_job1'
, program_name => 'simple_program1'
, schedule_name => 'simple_schedule'
, enabled => FALSE
);
END;
/
BEGIN
DBMS_SCHEDULER.SET_JOB_ANYDATA_VALUE
( job_name => 'compound_job1'
, argument_name => 'DELTA'
, argument_value => ANYDATA.CONVERTNUMBER ( 3 )
);
END;
/
EXECUTE DBMS_SCHEDULER.ENABLE ( 'compound_job1' )
Обратите внимание, что в этом случае задание сначала создается выключенным, и только после указания значения параметра программе оно может включаться.
