Планировщик заданий в 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' )

Обратите внимание, что в этом случае задание сначала создается выключенным, и только после указания значения параметра программе оно может включаться.