Что такое обработка исключений в PL / SQL?
Исключение возникает, когда механизм PL / SQL встречает инструкцию, которую он не может выполнить из-за ошибки, возникающей во время выполнения. Эти ошибки не будут фиксироваться во время компиляции, и, следовательно, их необходимо обрабатывать только во время выполнения.
Например, если механизм PL / SQL получает инструкцию разделить любое число на «0», то механизм PL / SQL выдаст это как исключение. Исключение возникает только во время выполнения механизмом PL / SQL.
Исключения остановят дальнейшее выполнение программы, поэтому, чтобы избежать такого состояния, их необходимо фиксировать и обрабатывать отдельно. Этот процесс называется обработкой исключений, в котором программист обрабатывает исключение, которое может возникнуть во время выполнения.
В этом руководстве вы изучите следующие темы:
- Синтаксис обработки исключений
- Типы исключений
- Предопределенные исключения
- Пользовательское исключение
- Исключение повышения уровня PL / SQL
- Важные моменты, на которые следует обратить внимание в исключении
Синтаксис обработки исключений
Исключения обрабатываются на уровне блока, т. Е. Один раз, если какое-либо исключение возникает в каком-либо блоке, управление выйдет из исполнительной части этого блока. Затем исключение будет обрабатываться в части обработки исключений этого блока. После обработки исключения невозможно повторно отправить управление в раздел выполнения этого блока.
Приведенный ниже синтаксис объясняет, как перехватить и обработать исключение.
BEGIN… EXCEPTIONWHEN THEN WHEN OTHERSTHEN END;
Объяснение синтаксиса:
- В приведенном выше синтаксисе блок обработки исключений содержит серию условия WHEN для обработки исключения.
- За каждым условием WHEN следует имя исключения, которое, как ожидается, будет вызвано во время выполнения.
- Когда во время выполнения возникает какое-либо исключение, то механизм PL / SQL будет искать это конкретное исключение в части обработки исключений. Он начнется с первого предложения WHEN и будет последовательно искать.
- Если он обнаружил обработку исключения для возникшего исключения, он выполнит эту конкретную часть кода обработки.
- Если для возникшего исключения нет ни одного предложения WHEN, то механизм PL / SQL выполнит часть WHEN OTHERS (если есть). Это общее для всех исключение.
- После выполнения исключения часть управления уйдет из текущего блока.
- Только одна часть исключения может быть выполнена для блока во время выполнения. После его выполнения контроллер пропустит оставшуюся часть обработки исключений и выйдет из текущего блока.
Примечание: КОГДА ДРУГИЕ всегда должны быть в последней позиции последовательности. Часть обработки исключений, присутствующая после WHEN OTHERS, никогда не будет выполнена, поскольку управление выйдет из блока после выполнения WHEN OTHERS.
Типы исключений
В Pl / SQL есть два типа исключений.
- Предопределенные исключения
- Пользовательское исключение
Предопределенные исключения
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, кроме предопределенных выше исключений, программист может создать собственное исключение и обработать его. Их можно создать на уровне подпрограммы в части объявления. Эти исключения видны только в этой подпрограмме. Исключение, определенное в спецификации пакета, является общедоступным исключением, и оно видно везде, где доступен пакет. <
Синтаксис: на уровне подпрограммы
DECLAREEXCEPTION;BEGIN EXCEPTIONWHEN THEN END;
- В приведенном выше синтаксисе переменная "имя_исключения" определена как тип "ИСКЛЮЧЕНИЕ".
- Это можно использовать аналогично предопределенному исключению.
Синтаксис: на уровне спецификации пакета
CREATE PACKAGEIS EXCEPTION;… END ;
- В приведенном выше синтаксисе переменная 'exception_name' определена как тип 'EXCEPTION' в спецификации пакета
. - Его можно использовать в базе данных везде, где может быть вызван пакет package_name.
Исключение повышения уровня PL / SQL
Все предопределенные исключения вызываются неявно при возникновении ошибки. Но пользовательские исключения необходимо вызывать явно. Этого можно добиться с помощью ключевого слова RAISE. Это можно использовать любым из способов, упомянутых ниже.
Если «RAISE» используется в программе отдельно, то оно распространит уже созданное исключение на родительский блок. Только в блоке исключения можно использовать, как показано ниже.
CREATE [ PROCEDURE | FUNCTION ]ASBEGINEXCEPTIONWHEN THEN RAISE;END;
Объяснение синтаксиса:
- В приведенном выше синтаксисе ключевое слово RAISE используется в блоке обработки исключений.
- Всякий раз, когда программа встречает исключение "имя_исключения", исключение обрабатывается и будет выполнено в обычном режиме.
- Но ключевое слово RAISE в части обработки исключений распространит это конкретное исключение на родительскую программу.
Примечание. При возбуждении исключения в родительском блоке возникающее исключение также должно быть видно в родительском блоке, иначе oracle выдаст ошибку.
- Мы можем использовать ключевое слово RAISE, за которым следует имя исключения, чтобы вызвать это конкретное определяемое пользователем / предопределенное исключение. Это можно использовать как в части выполнения, так и в части обработки исключений, чтобы вызвать исключение.
CREATE [ PROCEDURE | FUNCTION ]ASBEGINRAISE EXCEPTIONWHEN THEN END;
Объяснение синтаксиса:
- В приведенном выше синтаксисе ключевое слово 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
- Обработка исключений
- Определить исключение
- Поднимите исключение
- Распространение исключения