Користувачі серверів баз даних в більшості випадків мають змогу передбачити створення та обробку визначених виняткових ситуацій, з якими він поєднує формування відповідного повідомлення. Винятки (Exceptions) використовують у збережених процедурах та тригерах.
Винятки є глобальними у бази даних. Відповідні до них повідомлення або набір повідомлень доступні для всіх збережених процедур і тригерів в додатку . Коли тригер або збережена процедура збуджують виняток то: припиняється виконання тригеру або процедури та і знищуються будь-які дії, які були виконані; формується відповідне до винятку повідомлення.
Винятки можуть бути активізовані і оброблені за допомогою оператора WHEN в збереженій процедурі або тригері.
Створення винятків виконується оператором CREATE EXCEPTION.
Синтаксис оператора:
CREATE EXCEPTION name "<message>";
Опис параметрів:
name
-
унікальне ім'я винятку
"<message>"
-
текст повідомлення, максимальна довжина 78 символів
Приклад використання:
CREATE EXCEPTION UNKNOWN_EMP_ID "Invalid employee number or project id.";
Модифікація винятку виконується оператором ALTER EXCEPTION.
Синтаксис оператора:
ALTER EXCEPTION name "<message>";
Опис аргументів:
name
-
назва існуючого винятку
"<message>"
-
текстове повідомлення
Приклад використання:
ALTER EXCEPTION CUSTOMER_CHECK "Hold shipment for customer remittance.";
Вилучення винятку виконується оператором DROP EXCEPTION.
Синтаксис оператора:
DROP EXCEPTION name "<message>" - вилучити виняток з іменем name;
Механізм обробки виняткових ситуацій в SQL/89 дуже простий (можна сказати, примітивний).
Можна задавати реакцію на виникнення двох видів умов: SQLERROR - це умова появи від`ємного значення в змінній SQLCODE після виконання вбудованого оператора; NOT FOUND - умова появи в SQLCODE значення +100 (цей код означає вичерпання результуючої множини запиту при його перегляді через курсор). Реакція може полягати в виконанні безумовного переходу на позначку (мітку) основної програми (дія GO TO) або бути відсутня (дія CONTINUE). Спрацьовує той оператор визначення реакції на виняткову ситуацію, який текстуально ближче від початку програми до даного оператора SQL.
Відмітимо, що в багатьох реалізаціях підтримується два види кодів відповіді при виконанні операторів SQL (вбудованих або взятих з модуля): через змінну SQLCODE з кодами відповіді, які є цілими числами, і через змінну SQLSTATE з кодами відповіді, що кодуються десятковими числами, даними в текстовій формі. Є тенденція до переходу на використання тільки механізму SQLSTATE, але в стандартних реалізаціях повинен підтримуватися і механізм SQLCODE.