Оператор WHEN ... DO обеспечивает обработку возникших ошибок. Оператор применяется в хранимых процедурах и триггерах.
Синтаксис:
WHEN {<список_ошибок> / ANY}
DO <операторы>
< список_ошибок> ::=
{EXCEPTION имя_исключения / SQLCODE номер / GDSCODE код_ошибки}
Оператор WHEN должен быть последним в блоке BEGIN...END. С его помощью процедуры и триггеры могут обрабатывать ошибки трех типов:
ü Исключения, инициированные оператором EXCEPTION в данной процедуре или процедурах, прямо или косвенно вызванных данной, а также исключения, инициированные в триггерах, вызванных в результате действий этих процедур.
ü SQL-ошибки, идентифицирующиеся SQLCODE
ü Ошибки, идентифицирующиеся кодами ошибок InterBase.
Конструкция ANY позволяет выполнять операторы обработки при возникновении любых ошибок перечисленных типов.
Сводка синтаксиса оператора WHEN приведена в таблице.
Параметр
Описание
EXCEPTION имя_исключения
Имя исключения (описанного в базе)
SQLCODE номер
Код ошибки - SQLCODE
GDSCODE код_ошибки
Код ошибки InterBase
ANY
Обеспечивает вызов обработчика для любых перехватываемых ошибок
<операторы>
Простой оператор или блок, осуществляющий обработку ошибок
3.12.1 Обработка исключений
Вместо завершения работы при возникновении исключения процедура может обработать и возможно исправить ситуацию, приведшую к исключению. При возникновении исключения выполняются следующие действия:
1.Прекращается выполнение блока BEGIN ... END, содержащего исключение, и отменяются действия, выполненные в блоке.
2.Если блок содержит оператор WHEN, управление передается в WHEN, в противном случае аналогичные действия производятся в блоке, содержащем данный. Подобные действия производятся до тех пор, пока либо не будет найден соответствующий WHEN, либо не будет достигнут уровень процедуры. В последнем случае процедура будет завершена, а исключение не будет обработано.
3.Выполняются действия, определенные оператором (блоком), заданным в конструкции WHEN (если он обнаружен).
Управление возвращается оператору (блоку) программы, следующему за оператором WHEN.
Если исключение обработано с помощью WHEN, то соответствующее сообщение об ошибке не выдается.
3.12.2 Обработка ошибок SQL
Процедуры могут также обрабатывать ошибки SQL по кодам, возвращенным в SQLCODE. После выполнения каждой команды SQL формируется код ее завершения - SQLCODE, отражающий успешность выполнения, или код ошибки. SQLCODE может также содержать код предупреждения, типа того, что перечень строк в выборке по циклу FOR SELECT исчерпан.
Коды завершения команд SQL
SQLCODE
Описание
Успешное завершение
1-99
Предупреждение или информационное сообщение
Конец файла (списка)
<0
Ошибка. Команда не выполнена
Пример
WHEN SQLCODE -803
/*Попытка добавить строку со значением первичного ключа,
которое уже есть в таблице */
DO
BEGIN
…
3.12.3 Обработка ошибок InterBase
Процедуры могут обрабатывать ошибки InterBase по кодам, возвращенным в GDSCODE. Например, если команда в процедуре пытается модифицировать строку, уже модифицированную другой, еще не завершенной, транзакцией, то в этом случае процедура могла бы получать код ошибки InterBase, isc_lock_conflict. При повторении попытки ее модификации, другая транзакция может выполнить откат, сняв, таким образом, блокировку, что позволит успешно завершить команду. Используя инструкцию WHEN GDSCODE, процедура может обрабатывать ошибки конфликта блокировки и повторять его операцию.
В качестве примера рассмотрим фрагмент хранимой процедуры с возвращаемым параметром RETCODE, который устанавливается в 0 при нормальном выполнении процедуры и в 1 при возникновении каких либо ошибок