Обработка ошибок в PL/SQL

Язык 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.

Вас заинтересует / Intresting for you:

Oracle Text и PL/SQL: многоязы...
Oracle Text и PL/SQL: многоязы... 3477 просмотров Максим Николенко Fri, 18 Oct 2019, 12:41:03
Сопровождение объектных типов ...
Сопровождение объектных типов ... 3705 просмотров Максим Николенко Sun, 03 Nov 2019, 09:18:04
 Версии PL/SQL и Oracle 12c
Версии PL/SQL и Oracle 12c 3409 просмотров Александров Попков Tue, 21 Nov 2017, 13:28:01
Структура блока PL/SQL
Структура блока PL/SQL 8172 просмотров Илья Дергунов Tue, 10 Jul 2018, 06:35:51
Войдите чтобы комментировать

AidaU аватар
AidaU ответил в теме #9218 5 года 6 мес. назад
Коротенькая заметка, но со смыслом. Хороший поясняющих пример по поводу поиска и обработки ошибок. Ох уж этот вездесущий EXCEPTION. Муторно порой его прописывать, но в дальнейшем жизнь облегчает существенно нашему брату программеру. Спасибо! Да, и развейте тему в более подробную статью об исключениях!