Пример внутреннего задания в виде неименованного блока PL/SQL:
BEGIN DBMS_SCHEDULER.CREATE_JOB
( job_name => 'simple_job' , jobtype => 'PLSQL_BLOCK' , job_action => 'UPDATE emp SET sal = sal +1;' , enabled => TRUE ); END; /
Обратите внимание:
COMMIT; UPDATE emp SET sal = sal + 1; BEGIN DBMS_SCHEDULER.CREATE_JOB (... как выше ...) END; ROLLBACK;
Зарплата SAL увеличится на 2. Проверить это в качестве упражнения.
Для хранимой процедуры задание формируется аналогично:
CREATE PROCEDURE updatesal AS BEGIN UPDATE emp SET sal = sal - 1; END;
/
BEGIN DBMS_SCHEDULER.CREATE_JOB ( job_name => 'simple_job' , jobtype => 'STORED_PROCEDURE' , job_action => 'updatesal' , enabled => TRUE ) ; END; /
Обратите внимание, что нам не потребовалось удалять старое задание SIMPLE_JOB, так как при выбранных нами параметрах процедуры CREATE_JOB задания (и первое, и второе) прогонялись однократно, моментально и сразу же удалялись автоматически. Последнее как раз можно и отменить посредством не использованного в примере выше параметра AUTO_DROP.
В случае невозможности запустить задание СУБД, подобно тому, как это делалось для старого планировщика (пакет DBMS_JOB), будет делать повторные попытки, но только по несколько иной схеме: через секунду, затем через 10 секунд, затем через 100 и далее – всего 6 раз, если только до этого не наступит очередной плановый момент.