Обработка исключений Oracle PL / SQL: примеры возникновения пользовательских исключений

Содержание:

Anonim

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

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

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

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

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

  • Синтаксис обработки исключений
  • Типы исключений
  • Предопределенные исключения
  • Пользовательское исключение
  • Исключение повышения уровня PL / SQL
  • Важные моменты, на которые следует обратить внимание в исключении

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

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

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

BEGIN… EXCEPTIONWHEN THENWHEN OTHERSTHENEND;

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

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

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

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

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

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

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

Oracle предопределил несколько распространенных исключений. У этих исключений есть уникальное имя исключения и номер ошибки. Эти исключения уже определены в пакете «СТАНДАРТ» в 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;BEGINEXCEPTIONWHEN  THENEND;
  • В приведенном выше синтаксисе переменная "имя_исключения" определена как тип "ИСКЛЮЧЕНИЕ".
  • Это можно использовать аналогично предопределенному исключению.

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

CREATE PACKAGE 
IS EXCEPTION;… END 
;
  • В приведенном выше синтаксисе переменная 'exception_name' определена как тип 'EXCEPTION' в спецификации пакета .
  • Его можно использовать в базе данных везде, где может быть вызван пакет package_name.

Исключение повышения уровня PL / SQL

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

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

CREATE [ PROCEDURE | FUNCTION ]ASBEGINEXCEPTIONWHEN  THENRAISE;END;

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

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

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

  • Мы можем использовать ключевое слово RAISE, за которым следует имя исключения, чтобы вызвать это конкретное определяемое пользователем / предопределенное исключение. Это можно использовать как в части выполнения, так и в части обработки исключений, чтобы вызвать исключение.
CREATE [ PROCEDURE | FUNCTION ]ASBEGINRAISE EXCEPTIONWHEN  THENEND;

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

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

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

  • Как объявить исключение
  • Как поднять заявленное исключение и
  • Как распространить его на основной блок
DECLARESample_exception EXCEPTION;PROCEDURE nested_blockISBEGINDbms_output.put_line(‘Inside nested block’);Dbms_output.put_line(‘Raising sample_exception from nested block’);RAISE sample_exception;EXCEPTIONWHEN sample_exception THENDbms_output.put_line (‘Exception captured in nested block. Raising to main block’);RAISE,END;BEGINDbms_output.put_line(‘Inside main block’);Dbms_output.put_line(‘Calling nested block’);Nested_block;EXCEPTIONWHEN sample_exception THEN Dbms_output.put_line (‘Exception captured in main block');END:/

Пояснение к коду:

  • Строка кода 2 : Объявление переменной sample_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 (- , ) может использоваться вместо RAISE, чтобы вызвать ошибку с помощью кода пользователя и сообщения. Код ошибки должен быть больше 20000 и иметь префикс «-».

Резюме

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

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