Учебники

15) Обработка исключений в PL / SQL

Что такое обработка исключений в PL / SQL?

Исключение возникает, когда механизм PL / SQL встречает инструкцию, которую он не может выполнить из-за ошибки, возникающей во время выполнения. Эти ошибки не будут регистрироваться во время компиляции, и, следовательно, их необходимо обрабатывать только во время выполнения.

Например, если механизм PL / SQL получает инструкцию делить любое число на «0», то механизм PL / SQL выбрасывает его как исключение. Исключение возникает только во время выполнения движком PL / SQL.

Исключения будут препятствовать дальнейшему выполнению программы, поэтому, чтобы избежать такого условия, они должны быть записаны и обработаны отдельно. Этот процесс называется обработкой исключений, при которой программист обрабатывает исключение, которое может возникнуть во время выполнения.

В этом уроке вы изучите следующие темы:

Синтаксис обработки исключений

Исключения обрабатываются на уровне блока, т. Е. Один раз, если какое-либо исключение возникает в каком-либо блоке, элемент управления выйдет из исполняющей части этого блока. Затем исключение будет обработано в части обработки исключений этого блока. После обработки исключения невозможно повторно отправить управление обратно в секцию выполнения этого блока.

Приведенный ниже синтаксис объясняет, как перехватить и обработать исключение.

Обработка исключений в PL / SQL

BEGIN
<execution block>
.
.
EXCEPTION
WHEN <exceptionl_name>
THEN
  <Exception handling code for the “exception 1 _name’' >
WHEN OTHERS
THEN
  <Default exception handling code for all exceptions >
END;

Синтаксис Объяснение:

  • В приведенном выше синтаксисе блок обработки исключений содержит последовательность условий WHEN для обработки исключения.
  • Каждое условие WHEN сопровождается именем исключения, которое, как ожидается, будет вызвано во время выполнения.
  • Когда какое-либо исключение возникает во время выполнения, механизм PL / SQL будет искать в этой части исключение в части обработки исключений. Он будет начинаться с первого предложения WHEN и последовательно будет выполнять поиск.
  • Если он обнаружил обработку исключения для возникшего исключения, то он выполнит эту конкретную часть кода обработки.
  • Если ни одно из условий «WHEN» не присутствует в исключении, которое было сгенерировано, то механизм PL / SQL выполнит часть «WHEN OTHERS» (если присутствует). Это общее для всех исключений.
  • После выполнения исключения управление деталями выйдет из текущего блока.
  • Только одна исключительная часть может быть выполнена для блока во время выполнения. После его выполнения контроллер пропустит оставшуюся часть обработки исключений и выйдет из текущего блока.

Примечание: КОГДА ДРУГИЕ должны всегда быть в последней позиции последовательности. Часть обработки исключений, присутствующая после WHEN OTHERS, никогда не будет выполнена, так как элемент управления выйдет из блока после выполнения WHEN OTHERS.

Типы исключений

В Pl / SQL есть два типа исключений.

  1. Предопределенные исключения
  2. Пользовательское исключение

Предопределенные исключения

Oracle предопределил некоторые распространенные исключения. Эти исключения имеют уникальное имя исключения и номер ошибки. Эти исключения уже определены в пакете STANDARD в Oracle. В коде мы можем напрямую использовать эти предопределенные имена исключений для их обработки.

Ниже приведены несколько предопределенных исключений

исключение Код ошибки Причина исключения
ACCESS_INTO_NULL ORA-06530 Присвойте значение атрибутам неинициализированных объектов
CASE_NOT_FOUND ORA-06592 Ни одно из условий «WHEN» в операторе CASE не выполнено, а предложение «ELSE» не указано
COLLECTION_IS_NULL ORA-06531 Использование методов коллекции (кроме EXISTS) или доступ к атрибутам коллекции в неинициализированных коллекциях
CURSOR_ALREADY_OPEN ORA-06511 Попытка открыть курсор, который уже открыт
DUP_VAL_ON_INDEX ORA-00001 Хранение повторяющегося значения в столбце базы данных, который ограничен уникальным индексом
INVALID_CURSOR ORA-01001 Недопустимые операции с курсором, такие как закрытие неоткрытого курсора
НЕПРАВИЛЬНЫЙ НОМЕР ORA-01722 Преобразование символа в число не выполнено из-за неправильного символа числа
ДАННЫЕ НЕ НАЙДЕНЫ ORA-01403 Когда оператор SELECT, содержащий предложение INTO, не извлекает строки.
ROW_MISMATCH ORA-06504 Когда тип данных переменной курсора несовместим с фактическим типом возврата курсора
SUBSCRIPT_BEYOND_COUNT ORA-06533 Ссылается на коллекцию по индексу, который больше, чем размер коллекции
SUBSCRIPT_OUTSIDE_LIMIT ORA-06532 Ссылается на коллекцию по номеру индекса, который находится за пределами допустимого диапазона (например: -1)
TOO_MANY_ROWS ORA-01422 Когда оператор SELECT с предложением INTO возвращает более одной строки
VALUE_ERROR ORA-06502 Арифметическая ошибка или ошибка ограничения размера (например: присвоение значения переменной, которая больше размера переменной)
ZERO_DIVIDE ORA-01476 Разделив число на «0»

Пользовательское исключение

В Oracle, кроме предопределенных выше исключений, программист может создавать свои собственные исключения и обрабатывать их. Они могут быть созданы на уровне подпрограммы в части объявления. Эти исключения видны только в этой подпрограмме. Исключением, определенным в спецификации пакета, является общедоступное исключение, и оно видно везде, где доступен пакет. <

Синтаксис: на уровне подпрограммы

DECLARE
<exception_name> EXCEPTION; 
BEGIN
<Execution block>
EXCEPTION
WHEN <exception_name> THEN 
<Handler>
END;
  • В приведенном выше синтаксисе переменная «имя-исключения» определена как тип «ИСКЛЮЧЕНИЕ».
  • Это можно использовать аналогично предопределенному исключению.

Синтаксис: на уровне спецификации пакета

CREATE PACKAGE <package_name>
 IS
<exception_name> EXCEPTION;
.
.
END <package_name>;
  • В приведенном выше синтаксисе переменная «имя_исключения» определена как тип «ИСКЛЮЧЕНИЕ» в спецификации пакета <имя_пакета>.
  • Это может использоваться в базе данных везде, где может быть вызван пакет «имя_пакета».

PL / SQL повышает исключение

Все предопределенные исключения возникают неявно при возникновении ошибки. Но определенные пользователем исключения должны быть вызваны явно. Это может быть достигнуто с помощью ключевого слова «Поднять». Это может быть использовано любым из способов, указанных ниже.

Если ‘RAISE’ используется отдельно в программе, то это распространит уже возникшее исключение в родительский блок. Только в блоке исключений можно использовать, как показано ниже.

Обработка исключений в PL / SQL

CREATE [ PROCEDURE | FUNCTION ]
 AS
BEGIN
<Execution block>
EXCEPTION
WHEN <exception_name> THEN 
             <Handler>
RAISE;
END;

Синтаксис Объяснение:

  • В приведенном выше синтаксисе ключевое слово RAISE используется в блоке обработки исключений.
  • Всякий раз, когда программа встречает исключение «имя_исключения», исключение обрабатывается и будет нормально завершено
  • Но ключевое слово «RAISE» в части обработки исключений распространит это конкретное исключение в родительскую программу.

Примечание. При возведении исключения в родительский блок возникающее исключение также должно быть видно в родительском блоке, иначе oracle выдаст ошибку.

  • Мы можем использовать ключевое слово «RAISE», за которым следует имя исключения, чтобы вызвать это конкретное пользовательское / предопределенное исключение. Это может использоваться как в части исполнения, так и в части обработки исключений, чтобы вызвать исключение.

Обработка исключений в PL / SQL

CREATE [ PROCEDURE | FUNCTION ] 
AS
BEGIN
<Execution block>
RAISE <exception_name>
EXCEPTION
WHEN <exception_name> THEN
<Handler>
END;

Синтаксис Объяснение:

  • В приведенном выше синтаксисе ключевое слово RAISE используется в части выполнения, за которой следует исключение «имя_исключения».
  • Это вызовет это конкретное исключение во время выполнения, и это необходимо обработать или поднять дальше.

Пример 1 : В этом примере мы увидим

  • Как объявить исключение
  • Как поднять заявленное исключение и
  • Как распространить это на основной блок

Обработка исключений в PL / SQL

Обработка исключений в PL / SQL

DECLARE
Sample_exception EXCEPTION;
PROCEDURE nested_block
IS
BEGIN
Dbms_output.put_line(‘Inside nested block’);
Dbms_output.put_line(‘Raising sample_exception from nested block’);
RAISE sample_exception;
EXCEPTION
WHEN sample_exception THEN 
Dbms_output.put_line (‘Exception captured in nested block. Raising to main block’);
RAISE,
END;
BEGIN
Dbms_output.put_line(‘Inside main block’);
Dbms_output.put_line(‘Calling nested block’);
Nested_block;
EXCEPTION
WHEN sample_exception THEN	
Dbms_output.put_line (‘Exception captured in main block');
END:
/

Объяснение кода:

  • Строка кода 2 : объявление переменной «sample_exception» в качестве типа EXCEPTION.
  • Строка кода 3 : Объявление процедуры nested_block.
  • Строка кода 6 : печать выписки «Внутри вложенного блока».
  • Строка кода 7: печать оператора «Повышение sample_exception из вложенного блока».
  • Строка кода 8: Вызов исключения с помощью RAISE sample_exception.
  • Строка кода 10: обработчик исключений для исключения sample_exception во вложенном блоке.
  • Строка кода 11: печать оператора «Исключение, захваченное во вложенном блоке. Подъем к основному блоку ».
  • Строка кода 12: Возврат исключения к основному блоку (распространение на основной блок).
  • Строка кода 15: печать выписки «Внутри основного блока».
  • Строка кода 16: печать оператора «Вызов вложенного блока».
  • Строка кода 17: вызов процедуры nested_block.
  • Строка кода 19: обработчик исключений для sample_exception в основном блоке.
  • Строка кода 20: печать заявления «Исключение зафиксировано в основном блоке».

Важные моменты, на которые следует обратить внимание в исключении

  • В функции исключение всегда должно либо возвращать значение, либо вызывать его еще больше. иначе Oracle выдаст ошибку «Функция вернулась без значения» во время выполнения.
  • Операторы управления транзакциями могут быть даны в блоке обработки исключений.
  • SQLERRM и SQLCODE — встроенные функции, которые выдают сообщение об исключении и код.
  • Если исключение не обрабатывается, то по умолчанию все активные транзакции в этом сеансе будут откатываться.
  • RAISE_APPLICATION_ERROR (- <код_ошибки>, <error_message>) можно использовать вместо RAISE, чтобы вызвать ошибку с помощью кода пользователя и сообщения. Код ошибки должен быть больше 20000 и иметь префикс «-».

Резюме

После этой главы. Вы должны быть в состоянии работать для следующих аспектов исключений Pl SQL

  • Обработка исключений
  • Определить исключение
  • Поднять исключение
  • Исключение распространения