Россия, Москва, Московский Государственный Университет имени Ломоносова М.В., 2002 |
Триггеры Oracle Forms. Классификация триггеров. Пользовательские триггеры
Цель лекции: ознакомить слушателя с понятием триггер, его структурой и областью действия.
Компоненты триггера
Компоненты триггера – это три главные составляющие триггера, которые определяют его основные свойства и назначение ( рис. 12.1).
- Область триггера (Trigger scope) – это уровень модуля, на котором определен триггер.
- Тип триггера (Trigger Type) – определяет принадлежность к тому или иному событию, во время которого он будет срабатывать.
- Код триггера (Trigger code) – это блок PL/SQL, определяющий действия триггера во время срабатывания.
Самое главное при написании, определении и кодировании триггера – точно понимать, когда и в какой момент происходит событие по отношению к другим событиям.
Сфера триггера (Trigger scope)
Область триггера определяет его позицию в иерархии объектов Oracle Forms, а именно – под каким объектом он будет создан. Ассоциированный с триггером объект определяет его уровень. Вы можете подсоединить триггер к форме, блоку, элементу или записи.
- Форма – триггер срабатывает для всей формы. Если вы, к примеру, создадите триггер KEY-COMMIT, то событие, описанное в нем, будет применено ко всему модулю.
- Блок – триггер срабатывает, если событие происходит в пределах блока. Если же у вас форме определено два блока и более, то триггер будет отвечать только на события того блока, в котором он определен. Если то же самое событие возникает в пределах другого блока, то оно касается только его.
- Элемент – триггер срабатывает, если событие происходит в пределах элемента, в котором он определен.
Если, к примеру, триггер WHEN-BUTTON-PRESSED создан для кнопки "BUTTON1", то он сработает только для этой кнопки, но не при нажатии "BUTTON2" или "BUTTON3". Если, к примеру, вы определите триггер WHEN-NEW-ITEM-INSTANCE на уровне элемента и для конкретного элемента, то действие, которое вы определили в теле триггера, будет срабатывать в момент, когда фокус ввода попадет именно в этот элемент, а не в какой другой. Если, к примеру, вы создали триггер WHENNEW-ITEM-INSTANCE на уровне блока, то в этом случае триггер будет срабатывать при попадании фокуса ввода в любой из элементов, принадлежащих блоку.
Кроме понятия уровень триггера существует еще четыре понятия:
- приоритет – если один и тот же триггер определен на всех трех уровнях иерархии, то первым сработает триггер с наименьшим уровнем – Record Level, уровень элемента (записи);
- ограничение по уровню определения – это значит, что не каждый из представленных триггеров в Oracle Forms может быть определен на том или ином уровне. По умолчанию при вызове списка триггеров отображаются только те, которые доступны для этого уровня, не давая вам возможность совершить ошибку. Например, триггер ON-LOGON можно определить только на уровне формы. Если вы хотите выполнить проверку записи, то сделать это вы можете, лишь подсоединив триггер WHEN-VALIDATE-RECORD к форме или блоку, но не к элементу;
- ограничение режима выполнения – это ограничение, которое запрещает выполнение того или иного триггера в режиме запроса, то есть свойство "Fire in Enter Query Mode" такого триггера по умолчанию установлено на No;
- ограничение на выполнения команд – в зависимости от типа триггера существуют ограничения на выполнение различных команд: навигация, сохранение, откат и так далее. Например, если вы попытаетесь выполнить в триггере с префиксом POST команду go_item, то получите ошибку: FRM-40737: Недопустима ограниченная процедура GO_ITEM в POST триггере.
Вы можете управлять приоритетами срабатывания триггеров, используя свойство "Иерархия выполнения" триггера, которое поможет вам решить, как поступить в случае, если подобный триггер уже определен на одном из уровней иерархии.
Код триггера
Код триггера – это анонимный блок PL/SQL, который выполняется при срабатывании триггера. Блок может состоять из трех разделов:
- раздел декларирования – этот раздел необходим для объявления переменных, констант, курсоров и исключений. Если у вас нет потребности в вышеперечисленных операциях, то этот раздел можно опустить;
- раздел исполняемых операторов – это секция, которая содержит основу вашего PL/SQL-блока, а именно – исполняемые операторы. Этот раздел обязателен;
- раздел обработчиков исключений – эта секция необязательна и используется для обработки исключений.
- Общий синтаксис блока PL/SQL выглядит так:
- DECLARE – декларативные операторы (необязательные)
- BEGIN – исполняемые операторы (обязательно)
- EXCEPTION – обработчики исключений (необязательно)
- END ;
- Если вы не объявляете переменные, то секция DECLARE не обязательна:
BEGIN Message('Первый блок'); BEGIN Message('Второй блок'); END; END;
- Операторы BEGIN и END необязательны, если вы не объявляете переменные и не используете вложенные блоки.
IF :SYSTEM.CURSOR_RECORD=1 THEN Message('Вы на первой записи'); END IF;
При написании тела триггера вы можете использовать:
- SQL-операторы, которые можно использовать в PL/SQL-блоке;
- стандартные PL/SQL-конструкции (константы, операторы управления и так далее);
- хранимые процедуры, функции и пакеты;
- встроенные подпрограммы и пакеты.
- Использование операторов SQL в триггере:
DECLARE Val NUMBER; BEGIN SELECT 1 INTO val FROM DUAL; Insert into table table_name (col) values (val); END;
- Стандартные PL/SQL-конструкции:
FOR I IN 1..10 LOOP (действие); END LOOP;
- Встроенные подпрограммы и пакеты:
SET_BLOCK_PROPERTY ('block_name', WHERE_CLAUSE, 'ROWNUM<=10');
- Хранимые процедуры, функции и пакеты:
DECLARE Val number; BEGIN My_procedure('value'); Val:=my_function('value'); END;
Классификация триггеров
Триггеры можно классифицировать по имени и по функциональности (табл. 12.1). Имя триггера состоит из двух основных частей – префикса и имени. Префикс в имени триггера означает момент или время его срабатывания (табл. 12.2), а имя – ассоциированное с ним событие. В Oracle Forms существует более 100 триггеров.
Префикс триггера | Описание |
---|---|
WHEN- | Сигнализирует о точке, в которой можно нарастить стандартную (по умолчанию) обработку Oracle Forms дополнительными условиями, задачами и исключениями. |
ON- | Срабатывает во время обработки события, сообщая о точке, в которой можно заменить стандартную обработку этого события, выполняемую Oracle Forms по умолчанию. |
PRE- | Срабатывает до выполнения действия, описанного в имени триггера. То есть если вы опишете какое-либо действие в триггере Pre-Query, то оно выполнится до того, как запрос будет обработан. |
POST- | Срабатывает после выполнения действия, описанного в имени триггера. То есть если вы опишете какое-либо действие в триггере Post-Query, то оно выполнится после того, как запрос будет обработан. |
KEY- | Срабатывает во время нажатия функциональной клавиши, имя которой ассоциировано с действием. |
Типы событий
В общем все события можно разбить на два типа.
События интерфейса – это внешние события интерфейса, результат действия которых выявляется сразу. К событиям интерфейса можно отнести следующие действия:
- нажатие на кнопку;
- изменение состояния выключателей и радиокнопок;
- нажатие командных клавиш.
События внутренней обработки – это события, происходящие вследствие выполнения какого-либо действия, в результате которого возникает ряд логически последовательных событий. Возникновение событий внутреннего интерфейса инициировано обработчиком Oracle Forms в соответствии с общей моделью обработки данных.
Пример № 1
У нас имеется форма из одного блока и двух элементов. Для того чтобы перейти из одного элемента в другой, нам достаточно нажать клавишу ENTER или кликнуть мышкой на втором элементе, то есть физически совершить одно действие – нажатие или клик. На самом же деле при перемещении из одного элемента в другой совершается ряд событий:
- Проверка элемента – WHEN-VALIDATE-ITEM.
- Покидание элемента – POST-ITEM.
- Проверить запись – WHEN-VALIDATE-RECORD.
- Покинуть запись – POST-RECORD.
- Вхождение в запись – PRE-RECORD.
- Вхождение в элемент – PRE-TEXT-ITEM.
- Запись готова для ввода – WHEN-NEW-RECORD-INSTANCE.
- Элемент готов для ввода – WHEN-NEW-ITEM-INSTANCE.
Итак, при переходе из одного элемента в другой имеем восемь событий – события внутренней обработки. Этот пример наглядно показывает, как при выполнении одного действия выполняется ряд других событий.
Пример № 2
На форме имеется два блока, в каждом из которых есть один текстовый элемент. Как и в предыдущем примере, чтобы перейти из одного блока в другой, нам достаточно выполнить одно действие, которое влечет за собой ряд событий внутренней обработки и в отличие от предыдущего примера будет содержать события блока.
- Проверка элемента – WHEN-VALIDATE-ITEM.
- Покидание элемента – POST-ITEM.
- Проверить запись – WHEN-VALIDATE-RECORD.
- Покинуть запись – POST-RECORD.
- Покинуть блок – POST-BLOCK.
- Войти в блок – PRE-BLOCK.
- Вхождение в запись – PRE-RECORD.
- Вхождение в элемент – PRE-TEXT-ITEM.
- Блок готов для ввода – WHEN-NEW-BLOCK-INSTANCE.
- Запись готова для ввода – WHEN-NEW-RECORD-INSTANCE.
- Элемент готов для ввода – WHEN-NEW-ITEM-INSTANCE.
Приведенные примеры помогут вам понять общую модель обработки Oracle Forms.