Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab2_7_-БД_ПИ.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2 Мб
Скачать
☆

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

26

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]