Планировщик JOB заданий. Управление.

добавлено: 18 фев 19
понравилось:0
просмотров: 2029
комментов: 0

теги:

Автор: Myp3_u_K

Чалышев Максим Михайлович

SQL. 5 дней которые изменят твою жизнь.

Введение
В Oracle есть специальный механизм запланировать выполнение определённой программы, на заданное время, это может быть оператор SQL, программа на языке PLSQL, либо даже внешняя программа. Этот механизм называется механизмом заданий Job

Данный механизм может применяться, например, для планирования запуска тяжелых запросов в ночное время или на выходные дни, распределения задач построения отчетности.

Теория и практика

Для управления заданиями в Oracle существует специальные пакет DBMS_JOB:
Создание заданий
Можно использовать механизм dbms_job
Или механизм dbms_scheduler – более современный способ
DBMS_JOB.SUBMIT(
 JOB OUT BINARY_INTEGER,
 WHAT IN VARCHAR2,
 NEXT_DATE IN DATE DEFAULT SYSDATE,
 INTERVAL IN VARCHAR2 DEFAULT NULL,
 NO_PARSE IN BOOLEAN DEFAULT FALSE,
 INSTANCE IN BINARY_INTEGER DEFAULT any_instance,
 FORCE IN BOOLEAN DEFAULT FALSE
);


Здесь:
JOB – Входной параметр уникальный идентификатор задания. Идентификатор генерируется специальной системной последовательностью.
WHAT - анонимный PL/SQL блок, в данном блоке указывается последовательность команд которая будет выполнена в процессе работы задания.
В же в этом параметре можно также писать команды вставки удаления редактирования (inser update delete), а так же команды для создания создания индексов таблиц, создания индексов, ограничений.
NEXT_DATE – дата время следующего выполнения задания.
Если будет указана дата меньше чем текущую дата, то выполнение задания будет начато немедленно.
INTERVAL – Вычисляемая дата следующего выполнения задания в столбце NEXT_DATE. Примеры интервала задания:
NULL
Задание выполнится однократно и удалится.

TRUNC(SYSDATE+1)+10/24

Задание будет выполняться ровно в 10 часов каждого дня
TRUNC(SYSDATE+1)+(11+(15/60))/24

Задание будет выполняться ровно в 11 часов 15 минут каждого дня.

TRUNC(LAST_DAY(SYSDATE))+(n+(m/60))/24

Задание будет выполняться ровно в n часов m минут последнего дня каждого месяца.

TRUNC(LAST_DAY(SYSDATE)+1)+(n+(m/60))/24

Задание будет выполняться ровно в n часов m минут первого дня каждого месяца.

NO_PARSE - флаг разбора PL/SQL выражения. Если его значение равно FALSE разбор происходит в момент установки задания. Иначе, в момент выполнения задания.

INSTANCE - какой экземпляр производит выполнение задания

FORCE – если значение этого параметра истинно тогда в качестве INSTANCE может выступать любое положительное целое число. В противном случае экземпляр, указанный в INSTANCE должен быть обязательно запущен, иначе будет вызвано исключение.
Пример2 создания задания

DECLARE jobno NUMBER
BEGIN
 DBMS_JOB.SUBMIT(:jobno,
 'DELETE AUTO;',
 TO_DATE('01.01.2015 01:05','DD.MM.YYYY HH24:MI'), 'TRUNC(SYSDATE+1)+(1+(5/60))/24');
 COMMIT;
  END;

Таблица будет очищаться каждый день в один час пять минут

Пример2 создания задания
DECLARE jobno NUMBER
BEGIN
 DBMS_JOB.SUBMIT(:jobno,
 'DELETE AUTO; INSERT INTO AUTO SELECT * FROM AUTO1;',
 TO_DATE('01.01.2015 01:05','DD.MM.YYYY HH24:MI'), 'TRUNC(SYSDATE+1)+(3+(5/60))/24');
 COMMIT;
  END;

Таблица будет очищаться каждый день в три часа пять минут и заполняться данными из AUTO1
Пример3 создания задания

DECLARE jobno NUMBER
BEGIN
 DBMS_JOB.SUBMIT(:jobno,
 'DROP AUTO1; CREATE TABLE AUTO1 AS SELECT * FROM AUTO;',
 TO_DATE('01.01.2015 01:05','DD.MM.YYYY HH24:MI'), 'TRUNC(SYSDATE+1)+(3+(5/60))/24');
 COMMIT;
  END;


Таблица будет очищаться каждый день в три часа пять минут и заполняться данными из AUTO1
Удаления задания можно сделать следующей процедурой:
DBMS_JOB.REMOVE ( JOB IN BINARY_INTEGER );

Здесь
JOB – идентификатор задачи
Выключение задания
Бывают случаи, когда задание временно не должно выполняться. Для этого совсем необязательно его удалять. Достаточно его просто выключить. Выключение (включение) задания производится установкой специального флага состояния - BROKEN. Делается это с помощью следующей процедуры:

DBMS_JOB.BROKEN (
 JOB IN BINARY_INTEGER,
 BROKEN IN BOOLEAN,
 NEXT_DATE IN DATE DEFAULT SYSDATE);

Просмотр всех заданий
Для просмотра всех заданий используются следующие таблицы DBA_JOBS, ALL_JOBS и USER_JOBS.
• DBA_JOBS – показывает все задания (JOB)
• ALL_JOBS -показвает задания (JOB) текущего пользователя
• USER_JOBS -показывает задания (JOB) текущего пользователя

Важные замечания
Вычисление NEXT_DATE с помощью формулы интервала происходит после выполнения задания. Поэтому, всегда учитывайте это время и старайтесь не ставить их на время близкое к окончанию суток из-за возможного неправильного расчёта следующей даты выполнения.

При создании задания или изменения его параметров ORACLE записывает текущие параметры NLS владельца. Эти параметры каждый раз восстанавливаются при выполнении задания. Это может приводить к некоторым ошибкам в случае ожидания других значений. Поэтому если необходимо лучше производить установку нужных NLS значений с помощью команды ALTER SESSION в параметре WHAT задания.

Задания в теле завершаются COMMIT;

Вопросы учеников
Есть ли еще способы создать задние используя планировщик заданий.
Да есть более современный метод DBMS_SCHEDULLER
Как создать задание которое бы выполнялось каждые полдня
Пример задания
DECLARE jobno NUMBER
BEGIN
 DBMS_JOB.SUBMIT(:jobno,
 'DELETE AUTO; INSERT INTO AUTO SELECT * FROM AUTO1;',
 TO_DATE('01.01.2015 01:05','DD.MM.YYYY HH24:MI'), 'TRUNC(SYSDATE+1/2)’);
 COMMIT;
  END;

Комментарии




Необходимо войти на сайт, чтобы оставлять комментарии