Иллюстрированный самоучитель по SQL для начинающих

Постоянно хранимые модули

Объявление обработчиков состояний

Обработчик состояния можно поместить в составную команду. При создании обработчика вначале следует объявить состояние, которое обработчик должен обрабатывать. Объявленное состояние может быть исключением или же некоторым другим состоянием. В табл. 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
.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.