Язык PL/SQL предоставляет разработчикам мощный механизм оповещения о возникающих ошибках и их обработки. Следующая процедура получает имя и баланс счета по идентификатору, после чего проверяет баланс. При слишком низком значении процедура явно инициирует исключение, которое прекращает выполнение программы:
PROCEDURE check_account (
account_id_in IN accounts.id%TYPE)
IS
l_balance_remaining NUMBER;
l_balance_below_minimum EXCEPTION;
l_account_name accounts.name%TYPE;
BEGIN
SELECT name
INTO l_account_name
FROM accounts
WHERE id = account_id_in;
l_balance_remaining := account_balance (account_id_in);
DBMS_OUTPUT.PUT_LINE (
'Баланс счета ' || l_account_name ||
' = ' || l_balance_remaining);
IF l_balance_remaining < 1000
THEN
RAISE l_balance_below_minimum;
END IF;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
-- Ошибочный идентификатор счета
log_error (...);
RAISE;
WHEN l_balance_below_minimum
THEN
log_error (...);
RAISE VALUE_ERROR;
END;
Рассмотрим подробнее ту часть кода, которая связана с обработкой ошибок.
Строки | Описание |
5 | Объявление пользовательского исключения с именем l_balance_below_minimum. В Oracle имеется набор заранее определенных исключений, таких как DUP_VAL_ON_INDEX, но для данного приложения я хочу создать нечто более конкретное, поэтому определяю собственный тип исключения |
8-11 | Запрос для получения имени счета. Если счет с указанным идентификатором не существует, Oracle инициирует стандартное исключение NO_DATA_FOUND, что ведет к завершению программы |
19-22 | Если баланс слишком низок, процедура явно инициирует пользовательское исключение, поскольку это свидетельствует о наличии серьезных проблем со счетом |
24 | Ключевое слово EXCEPTION отмечает конец исполняемого раздела и начало раздела исключений, в котором обрабатываются ошибки |
25-28 | Блок обработки ошибок для ситуации, когда счет не найден. Если было инициировано исключение NO_DATA_FOUND, здесь оно перехватывается, а ошибка регистрируется в журнале процедурой log_error. Затем я заново инициирую то же самое исключение, чтобы внешний блок был в курсе того, что для идентификатора счета отсутствует совпадение |
30-33 | Блок обработки ошибок для ситуации, когда баланс счета оказался слишком низким (пользовательское исключение для данного приложения). Если было инициировано исключение l_balance_below_minimum, оно перехватывается и ошибка регистрируется в журнале. Затем я инициирую системное исключение VALUE_ERROR, чтобы оповестить внешний блок о проблеме |
Механизмы обработки ошибок PL/SQL подробно рассмотрим в следующих статьях моего блога. Конечно, о PL/SQL еще можно сказать очень много — собственно, именно поэтому материал моего блога предполагают занять не одну сотню страниц! ;-) Но для начала пример выше дает некоторое представление о коде PL/SQL, его важнейших синтаксических элементах и о той простоте, с которой пишется (и читается) код PL/SQL.