Постоянно хранимые модули
Объявление обработчиков состояний
Обработчик состояния можно поместить в составную команду. При создании обработчика вначале следует объявить состояние, которое обработчик должен обрабатывать. Объявленное состояние может быть исключением или же некоторым другим состоянием. В табл. 19.2 представлены возможные состояния, а также кратко описаны причины возникновения состояния каждого вида.
Таблица 19.2. Состояния, которые можно определить в обработчике.
Состояние | Описание |
---|---|
SQLSTATE VALUE ' xxyyy ' | Соответствующее значение sqlstate |
SQLEXCEPTION | Класс sqlstate, отличный от '00', ' 01' или '02' |
SQLWARNING | Класс ' 01' |
NOT FOUND | Класс ' 02' |
Ниже приведен пример объявления состояния.
BEGIN DECLARE constraint_violation CONDITION FOR SQLSTATE VALUE '23 000'; END;
Приведенный пример не является взятым из жизни, поскольку внутри структуры BEGIN…END должны располагаться и команда SQL, ответственная за возникновение особого состояния, и его обработчик.
Действие и эффект обработчика
Как только возникает состояние, вызывающее соответствующий обработчик, выполняется действие, определенное этим обработчиком. Такое действие может быть простой или составной командой SQL. После успешного выполнения обработчика выполняется некоторое последействие, называемое эффектом. Ниже представлен список трех возможных эффектов обработчика.
- CONTINUE. Выполнение команды, следующей после команды, инициировавшей действие обработчика.
- EXIT. Выход из составной команды, содержащей обработчик, и выполнение следующей команды.
- UNDO. Отмена всех предыдущих команд составной и выполнение следующей команды.
Эффект CONTINUE лучше всего применять в том случае, если обработчик способен устранить любую проблему, вызвавшую его. Эффект EXIT применяется, если обработчику не под силу исправить проблему, но нет необходимости отменять изменения, сделанные составной командой. Эффект UNDO позволяет вернуться в состояние до выполнения составной команды. Рассмотрим следующий пример:
BEGIN ATOMIC DECLARE constraint_violation CONDITION FOR SQLSTATE VALUE '23000'; DECLARE UNDO HANDLER FOR constraint_violation RESIGNAL; INSERT INTO students (StudentID, Fname, Lname) VALUES (:sid, sfname,:slname); INSERT INTO roster (ClassID, Class, StudentID) VALUES (:sid, cname,:sid); END;
Если выполнение какой-либо из двух команд INSERT вызывает нарушение некоторого ограничения, например, в результате добавления записи с первичным ключом, уже присутствующим в таблице, в параметр SQLSTATE помещается значение 23000 и возникает состояние constraint_violation. Обработчик такого события отменяет изменения, внесенные в таблицы командами INSERT. Команда RESIGNAL возвращает управление процедуре, вызвавшей процедуру обработчика.
После успешного выполнения обеих команд INSERT следующей выполняется команда за ключевым словом END.
Помни:
Ключевое слово ATOMIC является обязательным в случае эффекта UNDO. Это не распространяется на обработчики с эффектами CONTINUE или EXIT.