Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Fondovi-lekcii.doc
Скачиваний:
20
Добавлен:
10.11.2018
Размер:
4.09 Mб
Скачать

2.2. Обробка виключень і помилок.

Виключення InterBase багато в чому схожі на виключення інших мов високого рівня, однак мають свої особливості. Фактично виключення InterBase – це повідомлення про помилку, що має власне, яке задається програмістом, ім'я і текст повідомлення про помилку. Створюється виключення в такий спосіб:

CREATE EXCEPTION <ім'я_виключення> <текст_виключення>;

Наприклад, ми можемо створити виключення такого виду:

CREATE EXCEPTION test_except 'Test exception';

Виключення легко чи вилучити чи змінити – вилучення задається командою

DROP EXCEPTION <ім'я_ вилучаємого_виключення>, а зміна – ALTER EXCEPTION <ім'я_виключення> <текст_виключення>.

Щоб використовувати виключення в збережуваній процедурі чи тригері, необхідно скористатися командою наступного виду:

EXCEPTION <ім'я_виключення>;

Давайте розглянемо застосування виключень на простому прикладі збережуваної процедури, що виконує ділення одного числа на інше і повертає результат. Нам необхідно відстежити випадок поділу на нуль і викликати виключення, якщо дільник дорівнює нулю.

Для нашого приклада створимо наступне виключення:

CREATE EXCEPTION zero_divide 'Cannot divide by zero!';

Створимо збережену процедуру, що використовує це виключення:

CREATE PROCEDURE SP_DIVIDE(DILENE DOUBLE PRECISION,

DILNYK DOUBLE PRECISION)

RETURNS(RESULT DOUBLE PRECISION)

AS

BEGIN

if (Dilnyk<0.0000001) then

BEGIN

EXCEPTION zero_divide;

Result=0;

END

ELSE

BEGIN

Result=Dilene/Dilnyk;

END SUSPEND;

END

Як бачите, текст ЗП тривіальний – на вході одержуємо Dilene і Dilnyk, потім порівнюємо Dilnyk з 0.0000001, тобто фактично з нулем, у межах обраної погрішності в одну десятимільйонну (тому що дійсні числа неможливо безпосередньо порівнювати через погрішності в дробовій частині). Якщо Dilnyk близький до нуля в межах обраної похибки, то ми збуджуємо виключення zero_divide. Що ж відбувається у випадку виникнення виключення? Якщо ми спробуємо викликати виключення, виконуючи процедуру SP_devide з нульовим дільником у ISQL, то одержимо наступне:

SQL> select * from sp_divide(300,0);

RESULT

Statement failed, SQLCODE = -836

exception 1

-Cannot divide by zero!

Іншими словами, повідомлення про помилку – це результат обробки нашого виключення сервером InterBase. Коли InterBase виявляє появу в ЗП чи тригері виключення, він перериває роботу цієї збережуваної процедури і відкочує всі зміни, зроблені в поточному блоці BEGIN...END.

3. 1.Означення тригера.

Тригер у InterBase – це особливий вид збереженої процедури, що виконується автоматично при вставці, чи вилученні або модифікації запису чи таблиці зображення (view). Тригери можуть "спрацьовувати" безпосередньо до чи відразу ж послу зазначеної події.

Як ви знаєте, SQL дає можливість вставляти, вилучати і модифікувати дані в таблицях бази даних за допомогою відповідних команд – INSERT, DELETE і UPDATE. Погодитеся, що було б непогано мати можливість перехопити передану команду і що-небудь зробити з даними, які додаються, вилучаються чи змінюються. Наприклад, записати ці дані в спеціальну табличку, а заодно записати, хто і коли зробив операцію над даною таблицею. Чи відразу ж перевірити дані, що вставляються, на яку-небудь хитру умову, яку неможливо реалізувати за допомогою опції CHECK, і в залежності від результатів перевірки прийняти проведені зміни чи відкинути їх; змінити ці дані на підставі деякого запиту чи змінити дані в інших зв'язаних таблицях.

Для того, щоб виконувати які-небудь дії, зв'язані зі зміною даних у базі даних, і існують тригери.

Фактично тригер являє собою набір команд процедурної мови InterBase, що реалізується при виконанні операцій INSERT/DELETE/UPDATE. На відміну від збережуваних процедур, тригер ніколи нічого не повертає (та й кому повертати, адже тригер явно не викликається). По тій же причині він не має також вхідних параметрів, але замість них має контекстні змінні NEW і OLD. Ці змінні дозволяють одержати доступ до полів таблиці, до якої приєднаний тригер.

Тригеру призначена роль віртуального цензора, що переглядає "листи" і який вільний зробити усе, що завгодно, – пропустити їх незмінними, підправити їх, просигналізувати про помилки чи навіть "докласти про це" кому слід.

Тригер завжди прив'язаний до якоїсь певної таблиці чи зображення і може "перехоплювати" дані тільки цієї таблиці. Давайте розглянемо класифікацію тригерів і призначення кожного виду. Як уже було сказано, існує 3 основних SQL-операції, застосовні до даних, – INSERT/DELETE/UPDATE. Відповідно перший поділ тригерів – за операціями, що обслуговуються. Кожен конкретний тригер прив'язаний до якої-небудь операції, тобто тригер спрацьовує, коли в "його" таблиці відбувається дана операція.

Спрацьовування тригера може відбуватися як "до" так і "після" операції. Таким чином, ми одержуємо 6 можливих видів тригерів на таблицю – до і після кожної з трьох можливих SQL-операції.

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