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