Що таке обробка винятків у 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 | Використання методів колекцій (крім ІСНУЄ) або доступ до атрибутів колекції в неініціалізованих колекціях |
CURSOR_ALREADY_OPEN | ORA-06511 | Спроба відкрити вже відкритий курсор |
DUP_VAL_ON_INDEX | ORA-00001 | Зберігання повторюваного значення у стовпці бази даних, яке обмежене унікальним індексом |
INVALID_CURSOR | ORA-01001 | Незаконні дії курсору, як закриття невідкритого курсору |
INVALID_NUMBER | ORA-01722 | Не вдалося перетворити символ у число через недійсний номер |
ДАНИХ НЕ ЗНАЙДЕНО | ORA-01403 | Коли оператор 'SELECT', що містить речення INTO, не отримує рядків. |
РАДКА_НЕЗАБІРНОСТІ | ORA-06504 | Коли тип даних курсорної змінної несумісний із фактичним типом повернення курсора |
SUBSCRIPT_BEYOND_COUNT | ORA-06533 | Посилання на колекцію за номером індексу, який перевищує розмір колекції |
ПЕРЕДПИСАТИСЯ_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 ;
- У вищезазначеному синтаксисі змінна 'ім'я_винятку' визначена як тип 'ВИНЯТК' у специфікації пакета <ім'я_пакета>.
- Це можна використовувати в базі даних, де б не було викликано пакет 'ім'я_пакета'.
Виняток підвищення PL / SQL
Усі попередньо визначені винятки виникають неявно, коли виникає помилка. Але визначені користувачем винятки потрібно чітко вказувати. Цього можна досягти за допомогою ключового слова "ПІДНІМАТИ". Це можна використовувати будь-яким із зазначених нижче способів.
Якщо 'RAISE' використовується окремо в програмі, то він розповсюдить вже викликаний виняток до батьківського блоку. Тільки в блоці винятків можна використовувати, як показано нижче.
CREATE [ PROCEDURE | FUNCTION ]ASBEGINEXCEPTIONWHEN THEN RAISE;END;
Пояснення синтаксису:
- У наведеному вище синтаксисі ключове слово RAISE використовується в блоці обробки винятків.
- Кожного разу, коли програма зустрічає виняток "имя_выключения", виняток обробляється і буде заповнено нормально
- Але ключове слово 'RAISE' у частині обробки винятків поширить цей виняток до батьківської програми.
Примітка: Під час підняття винятку до батьківського блоку виняток, який піднімається, також повинен бути видимим у батьківському блоці, інакше oracle видасть помилку.
- Ми можемо використовувати ключове слово 'RAISE', за яким слідує ім'я винятку, щоб викликати саме те, що визначено користувачем / заздалегідь визначене виключення. Це може бути використано як у частині виконання, так і в частині обробки винятків, щоб викликати виняток.
CREATE [ PROCEDURE | FUNCTION ]ASBEGINRAISE EXCEPTIONWHEN THEN END;
Пояснення синтаксису:
- У наведеному вище синтаксисі ключове слово RAISE використовується в частині виконання, за якою йде виняток "ім'я_винятку".
- Це призведе до виникнення цього особливого винятку під час виконання, і це потребує подальшого розгляду або підвищення.
Приклад 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' як типу 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
- Обробка винятків
- Визначте виняток
- Підняти виняток
- Поширення винятку