Обробка винятків у Oracle PL/SQL (приклади)
Що таке обробка винятків у PL/SQL?
Виняток виникає, коли механізм PL/SQL стикається з інструкцією, яку він не може виконати через помилку, яка виникає під час виконання. Ці помилки не будуть зафіксовані під час компіляції, тому їх необхідно обробляти лише під час виконання.
Наприклад, якщо механізм PL/SQL отримує вказівку розділити будь-яке число на «0», механізм 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, механізм PL/SQL виконає частину WHEN OTHERS (якщо є). Це загальне для всіх виняток.
- Після виконання винятку керування частиною вийде з поточного блоку.
- Тільки одна частина винятку може бути виконана для блоку під час виконання. Після його виконання контролер пропустить частину обробки винятків, що залишилася, і вийде з поточного блоку.
Примітка: 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 | Спроба відкрити a курсор яка вже відкрита |
DUP_VAL_ON_INDEX | ORA-00001 | Зберігання повторюваного значення в стовпці бази даних, яке обмежено унікальним індексом |
INVALID_CURSOR | ORA-01001 | Неприпустимі операції з курсором, як-от закриття невідкритого курсору |
INVALID_NUMBER | 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» |
Виняток, визначений користувачем
In Oracle, крім попередньо визначених вище винятків, програміст може створити власні винятки та обробити їх. Вони можуть бути створені на рівні підпрограми в частині оголошення. Ці винятки видимі лише в цій підпрограмі. Виняток, визначений у специфікації пакета, є загальнодоступним винятком, і він видимий скрізь, де доступний пакет.
Синтаксис: На рівні підпрограми
DECLARE <exception_name> EXCEPTION; BEGIN <Execution block> EXCEPTION WHEN <exception_name> THEN <Handler> END;
- У наведеному вище синтаксисі змінна 'exception_name' визначається як тип 'EXCEPTION'.
- Це можна використовувати подібно до попередньо визначеного винятку.
Синтаксис:На рівні специфікації пакета
CREATE PACKAGE <package_name> IS <exception_name> EXCEPTION; . . END <package_name>;
- У наведеному вище синтаксисі змінна 'exception_name' визначається як тип 'EXCEPTION' у специфікації пакета .
- Це можна використовувати в базі даних, де можна викликати пакет 'package_name'.
Виняток PL/SQL Raise
Усі попередньо визначені винятки викликаються неявно щоразу, коли виникає помилка. Але винятки, визначені користувачем, потрібно викликати явно. Цього можна досягти за допомогою ключового слова "RAISE". Це можна використовувати будь-яким із зазначених нижче способів.
Якщо «RAISE» використовується окремо в програмі, тоді він поширить уже викликане виключення до батьківського блоку. Лише в блоці винятків можна використовувати, як показано нижче.
CREATE [ PROCEDURE | FUNCTION ] AS BEGIN <Execution block> EXCEPTION WHEN <exception_name> THEN <Handler> RAISE; END;
Пояснення синтаксису:
- У наведеному вище синтаксисі ключове слово RAISE використовується в блоці обробки винятків.
- Кожного разу, коли програма стикається з винятком "exception_name", виняток обробляється та завершується нормально
- Але ключове слово "RAISE" у частині обробки винятків поширить цей конкретний виняток до батьківської програми.
Примітка: Під час виклику винятку до батьківського блоку викликаний виняток також має бути видимим у батьківському блоці, інакше оракул видасть помилку.
- Ми можемо використати ключове слово "RAISE", за яким слідує назва винятку, щоб викликати цей конкретний визначений користувачем/попередньо визначений виняток. Це можна використовувати як у частині виконання, так і в частині обробки винятків, щоб викликати виключення.
CREATE [ PROCEDURE | FUNCTION ] AS BEGIN <Execution block> RAISE <exception_name> EXCEPTION WHEN <exception_name> THEN <Handler> END;
Пояснення синтаксису:
- У наведеному вище синтаксисі ключове слово RAISE використовується у частині виконання, за яким слідує виняток "exception_name".
- Це викличе цей конкретний виняток під час виконання, і це потрібно обробити або підняти далі.
Приклад 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' як типу ВИНЯТКУ.
- Рядок коду 3: Оголошення процедури nested_block.
- Рядок коду 6: Друк оператора «Всередині вкладеного блоку».
- Рядок коду 7: Друк оператора «Викликання sample_exception із вкладеного блоку».
- Рядок коду 8: Викликання винятку за допомогою 'RAISE sample_exception'.
- Рядок коду 10: Обробник винятку для винятку sample_exception у вкладеному блоці.
- Рядок коду 11: Друк оператора «Виняток, зафіксований у вкладеному блоці. Підняття до основного блоку'.
- Рядок коду 12: Підвищення винятку до основного блоку (поширення до основного блоку).
- Рядок коду 15: Друк заяви «Всередині основного блоку».
- Рядок коду 16: Друк оператора «Виклик вкладеного блоку».
- Рядок коду 17: Виклик процедури nested_block.
- Рядок коду 18: Виняток
- Рядок коду 19: Обробник винятків для sample_exception у головному блоці.
- Рядок коду 20: Друк оператора «Виняток, зафіксований у головному блоці».
Важливі моменти, на які слід звернути увагу в розділі «Виняток».
- У функції виняток завжди повинен або повертати значення, або посилювати виняток далі. інше Oracle викличе помилку «Функція повернута без значення» під час виконання.
- Інструкції керування транзакціями можна надати в блоці обробки винятків.
- SQLERRM і SQLCODE — це вбудовані функції, які видають повідомлення про винятки та код.
- Якщо виняток не оброблено, за замовчуванням усі активні транзакції в цьому сеансі буде відкочено.
- RAISE_APPLICATION_ERROR (- , ) можна використовувати замість RAISE, щоб викликати помилку за допомогою коду користувача та повідомлення. Код помилки має бути більшим за 20000 і мати префікс «-».
Підсумки
Після цієї глави. ви повинні мати можливість працювати над наступними аспектами Pl SQL Винятки
- Обробка винятків
- Визначте виняток
- Підняти виняток
- Розповсюдження винятків