DBMS_SHEDULER. Запуск послідовних та залежних завдань
Архів номерів / 2009 / Випуск №10 (83) / DBMS_SHEDULER. Запуск послідовних та залежних завдань
АНТОН ПІЩУЛІН, головний спеціаліст ВАТ «ОТП Банк», займається розробкою та інтеграцією корпоративних інформаційних систем
DBMS_SHEDULER Запуск послідовних та залежних завдань
У корпоративних інформсистемах буває необхідно виконати розрахунки для звітів та вітрин даних для кінцевих користувачів.
Найчастіше всі ці обчислення не можна запустити одним процесом, оскільки під час виконання розрахунків необхідно дочекатися низки подій (наприклад, закінчення вивантаження з однієї системи до іншої для певної задачі). Можна, звичайно, спробувати спрогнозувати, коли відбудуться всі необхідні події, і запустити весь розрахунок одним процесом, але в цьому випадку кінцевий користувач побачить результат пізніше, що може вплинути на оперативність рішень, що приймаються особливо в умовах перерахунку великого обсягу даних.
У статті демонструється одне з можливих розв'язків задачі оптимізації запуску пов'язаних між собою процесів на платформі Oracle та об'єднаних у єдину систему керування на основі пакета DBMS_SCHEDULER. У прикладі використовується вбудований в Oracle механізм пов'язаних завдань (ланцюжка), об'єднаних разом в одну пакетну задачу, яка запускається за повідомленнями клієнта. Повідомлення записуються та читаються клієнтами з черги Oracle. Усі приклади коду наведено на PL/SQL, проте виконані дії можна зробити як з допомогою коду, і з допомогою Oracle EM (DBCONSOLE).
Для того щоб приступити до демонстрації технології зв'язаних ланцюжків задач Oracle, наведемо небагато теорії. У основі даної технології лежить планувальник завдань із розширеними функціями (розкладами). Розклад у Oracle 10gє окремою сутністю. Розклади бувають стандартними (старий варіант планувальника на основі пакета DBMS_JOB), на основі календаря (з можливістю завдання розширених правил на календар), на основі подій (заснований на читанні повідомлень користувача з черги). Останній варіант ми розглядатимемо далі, оскільки це відповідає нашій початковій постановці завдань.
Будь-яке завдання (Job) Oracle може бути прив'язане до розкладу. У свою чергу, одне завдання (Job) Oracle 10g може бути декількох типів. Нас цікавить перш за все пакетний тип, коли в якості коду, що запускається, вибирається ланцюжок процесів (CHAIN). Процеси в ланцюжку можуть бути простими програмами (процедурами) Oracle або розкладами або іншими ланцюжками. Ми розглядатимемо найпростіший – перший варіант. Тобто припустимо, що у нас є три процедури, що зберігаються. Дві перші з них повинні запускатися паралельно при настанні деякої події, а третя чекає на виконання їх, тільки потім починає свою роботу. Для практичного виконання користувачеві необхідний привілей dba.
Створення необхідних об'єктів черги
Оскільки події запуску та зупинки ланцюжка будуть знаходитися в черзі повідомлень Oracle, то на першому етапі нам необхідно створити необхідні для цього об'єкти (в Oracle EM Maintenance - Management - Messaging): тип повідомлення та таблиці черги, а також безпосередньо самої черги .
--Створення типу повідомлення
create or replace type dwh_que_type as object