Что такое обработка исключений в 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 есть два типа исключений.
- Предопределенные исключения
- Пользовательское исключение
Предопределенные исключения
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’ используется отдельно в программе, то это распространит уже возникшее исключение в родительский блок. Только в блоке исключений можно использовать, как показано ниже.
CREATE [ PROCEDURE | FUNCTION ] AS BEGIN <Execution block> EXCEPTION WHEN <exception_name> THEN <Handler> RAISE; END;
Синтаксис Объяснение:
- В приведенном выше синтаксисе ключевое слово RAISE используется в блоке обработки исключений.
- Всякий раз, когда программа встречает исключение «имя_исключения», исключение обрабатывается и будет нормально завершено
- Но ключевое слово «RAISE» в части обработки исключений распространит это конкретное исключение в родительскую программу.
Примечание. При возведении исключения в родительский блок возникающее исключение также должно быть видно в родительском блоке, иначе oracle выдаст ошибку.
- Мы можем использовать ключевое слово «RAISE», за которым следует имя исключения, чтобы вызвать это конкретное пользовательское / предопределенное исключение. Это может использоваться как в части исполнения, так и в части обработки исключений, чтобы вызвать исключение.
CREATE [ PROCEDURE | FUNCTION ] AS BEGIN <Execution block> RAISE <exception_name> EXCEPTION WHEN <exception_name> THEN <Handler> END;
Синтаксис Объяснение:
- В приведенном выше синтаксисе ключевое слово RAISE используется в части выполнения, за которой следует исключение «имя_исключения».
- Это вызовет это конкретное исключение во время выполнения, и это необходимо обработать или поднять дальше.
Пример 1 : В этом примере мы увидим
- Как объявить исключение
- Как поднять заявленное исключение и
- Как распространить это на основной блок
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
- Обработка исключений
- Определить исключение
- Поднять исключение
- Исключение распространения