Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Исключения






 

Исключение является именованным сообщением об ошибке и может вызываться в хранимой процедуре или в триггере. Исключение создается командой 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. Исключение, созданное в случае нарушений во внешнем ключе


Содержание

 

Лабораторная работа №3. 1

Разработка бизнес-логики на стороне SQL-сервера. 1

Цель работы.. 1

Порядок выполнения работы.. 1

Содержание отчета. 2

Разработка бизнес-логики на стороне SQL-сервера. 3

1. Просмотры.. 3

1.1. Типы просмотров. 6

2. Язык PSQL. 9

2.1. Особенности PSQL для триггеров. 15

3. Хранимые процедуры.. 16

4. Исключения. 21






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.