Обробка винятків у Oracle PL/SQL (приклади)

Що таке обробка винятків у 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, механізм PL/SQL виконає частину WHEN OTHERS (якщо є). Це загальне для всіх виняток.
  • Після виконання винятку керування частиною вийде з поточного блоку.
  • Тільки одна частина винятку може бути виконана для блоку під час виконання. Після його виконання контролер пропустить частину обробки винятків, що залишилася, і вийде з поточного блоку.

Примітка: WHEN OTHERS завжди має бути в останній позиції послідовності. Частина обробки винятків, присутня після WHEN OTHERS, ніколи не буде виконана, оскільки елемент керування вийде з блоку після виконання WHEN OTHERS.

Типи винятків

Існує два типи винятків Pl/SQL.

  1. Попередньо визначені винятки
  2. Виняток, визначений користувачем

Попередньо визначені винятки

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» використовується окремо в програмі, тоді він поширить уже викликане виключення до батьківського блоку. Лише в блоці винятків можна використовувати, як показано нижче.

Виняток PL/SQL Raise

CREATE [ PROCEDURE | FUNCTION ]
 AS
BEGIN
<Execution block>
EXCEPTION
WHEN <exception_name> THEN 
             <Handler>
RAISE;
END;

Пояснення синтаксису:

  • У наведеному вище синтаксисі ключове слово RAISE використовується в блоці обробки винятків.
  • Кожного разу, коли програма стикається з винятком "exception_name", виняток обробляється та завершується нормально
  • Але ключове слово "RAISE" у частині обробки винятків поширить цей конкретний виняток до батьківської програми.

Примітка: Під час виклику винятку до батьківського блоку викликаний виняток також має бути видимим у батьківському блоці, інакше оракул видасть помилку.

  • Ми можемо використати ключове слово "RAISE", за яким слідує назва винятку, щоб викликати цей конкретний визначений користувачем/попередньо визначений виняток. Це можна використовувати як у частині виконання, так і в частині обробки винятків, щоб викликати виключення.

Виняток PL/SQL Raise

CREATE [ PROCEDURE | FUNCTION ] 
AS
BEGIN
<Execution block>
RAISE <exception_name>
EXCEPTION
WHEN <exception_name> THEN
<Handler>
END;

Пояснення синтаксису:

  • У наведеному вище синтаксисі ключове слово RAISE використовується у частині виконання, за яким слідує виняток "exception_name".
  • Це викличе цей конкретний виняток під час виконання, і це потрібно обробити або підняти далі.

Приклад 1: У цьому прикладі ми збираємося побачити

  • Як оголосити виняток
  • Як підняти оголошений виняток і
  • Як поширити його на основний блок

Виняток PL/SQL Raise

Виняток PL/SQL Raise

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 Винятки

  • Обробка винятків
  • Визначте виняток
  • Підняти виняток
  • Розповсюдження винятків