4. Исключения
Исключение является именованным сообщением об ошибке и может вызываться в хранимой процедуре или в триггере. Исключение создается командой CREATE EXCEPTION, изменяется командой ALTER EXCEPTION и удаляется командой DROP EXCEPTION.
Хранимая процедура или триггер могут вызвать исключение по его имени. При вызове исключения оно возвращает сообщение об ошибке.
Для создания исключения необходимо использовать следующий синтаксис:
CREATE EXCEPTION name ' <message>';
В параметре name указывается имя исключения, а в параметре <message> — текст сообщения. В качестве примера можно создать исключение, которое будет использовано позже:
CREATE EXCEPTION COMPACT_EXEPT 'Защиты уникального ключа ';
Для удаления созданного исключения нужно выполнить следующий запрос:
DROP EXCEPTION COMPAC_EXEPT;
Исключение можно вызвать в произвольном месте программы при помощи команды EXCEPTION name, где в параметре name указывается имя исключения.
В триггерах и процедурах могут обрабатываться ошибки трех типов:
исключения, вызванные оператором EXCEPTION в данной процедуре или в триггере;
ошибки SQL, имеющие идентификатор SQLCODE;
ошибки Firebird, возвращаемые в GDSCODE.
Обработка ошибок может производиться при помощи конструкции WHEN ... DO, синтаксис которой приведен ниже:
WHEN {< error> [, <error> ...] | ANY}
DO <compound_statement>
< error> =
{EXCEPTION exception_name | SQLCODE number | GDSCODE errcode}
Это выражение должно помещаться в конце тела триггера или хранимой процедуры. Параметр ANY позволяет указывать на то, что будет производиться перехват любых возникающих ошибок.
При возникновении исключения процедура или триггер получают управление назад и могут попытаться исправить ситуацию каким-либо образом. При возникновении исключения выполняется определенная цепочка действий:
Производится поиск секции WHEN ... DO. Если она не существует, то прекращается выполнение действий в блоке BEGIN _ END и производится откат доследующего уровня. Поиск повторяется на следующем уровне.
Если блок BEGIN ... END какого-либо уровня содержит блок WHEN ... DO, то управление передается этому блоку. В противном случае хранимая процедура завершает свою работу.
Если управление было передано блоку WHEN . . . DO, то последовательно выполняются инструкции этого блока. Затем управление возвращается блоку процедуры или триггера, следующему за блоком WHEN . . . DO.
Рассмотрим пример создания и использования исключений с помощью утилиты IBExpert при разработке информационной системы «Аренда недвижимости».
Ниже приведен SQL-скрипт создания исключений
CREATE EXCEPTION ER_FOR_KEY '"НАРУШЕНИЕ ВО ВНЕШНЕМ КЛЮЧЕ"';
CREATE EXCEPTION IMPOSSIBLE_RENT_PRICE '"Арендная плата должна быть > 0"';
Результат создания исключений с помощью утилиты IBExpert приведен на рисунке 11.
Рисунок 11. Исключения созданные с помощью утилиты IBExpert
Далее приведен SQL-скрипт хранимой процедуры INSERT_LEASE, в которой используются созданные исключения
CREATE PROCEDURE INSERT_LEASE (
N_OWNER SMALLINT,
N_TENANT SMALLINT,
N_REALT SMALLINT,
NEW_PRICE NUMERIC(6,2),
NEW_DATE TIMESTAMP)
AS
begin
if (:new_price <=0) then EXCEPTION impossible_rent_price;
else
begin
INSERT INTO lease (ID_OWNER,ID_TENANT,ID_REALTY,PRICE,"DATE")
VALUES (:n_owner,:N_TENAойNT,:N_REALT,:new_price,:new_date);
when sqlcode - 530 do EXCEPTION er_for_key;
end
suspend;
end
Хранимая процедура INSERT_LEASE позволяет ввести в таблицу lease информацию о заключенных договорах аренды недвижимости. Если значение переменной new_price равно нулю то возникает исключение IMPOSSIBLE_RENT_PRICE. Если значение переменной N_TENANT отсутствует в поле ID таблицы TENANT, то возникает исключение с кодом sqlcode равным -530. Оператор WHEN будет обрабатывать ошибку SQL с кодом 530.Это исключение возникает при нарушения во внешнем ключе. Полный список ошибок SQL можно найти в документе по СУБД Firebird «Language Reference. Error Codes and Messages. SQLCODE error codes and messages.»
Результаты выполнения хранимой процедуры INSERT_LEASE в случае ввода отрицательного значения переменной NEW_PRICE приведены на рисунках 12.- 13.
Рисунок 12. Ввод входных параметров хранимой процедуры INSERT_LEASE с использование утилиты IBExpert
Рисунок 13. Исключение, созданное в случае ввода отрицательного значения переменной NEW_PRICE
Результаты выполнения хранимой процедуры INSERT_LEASE в случае нарушений во внешнем ключе приведены на рисунках 14.- 15.
Рисунок 14. Ввод входных параметров хранимой процедуры INSERT_LEASE с использование утилиты IBExpert
Рисунок 15. Исключение, созданное в случае нарушений во внешнем ключе
Содержание
Лабораторная работа №7 1
Разработка бизнес-логики на стороне SQL-сервера 1
Цель работы 1
Порядок выполнения работы 1
Содержание отчета 2
1. Просмотры 3
2. Язык PSQL 9
3. Хранимые процедуры 16
4. Исключения 21
