Oracle PL / SQL обработка на изключения: Примери за повишаване на дефинирано от потребителя изключение

Съдържание:

Anonim

Какво представлява обработката на изключения в PL / SQL?

Изключение се случва, когато PL / SQL механизмът срещне инструкция, която не може да изпълни поради грешка, която възниква по време на изпълнение. Тези грешки няма да бъдат уловени по време на компилацията и следователно те трябва да бъдат обработвани само по време на изпълнение.

Например, ако PL / SQL механизмът получи инструкция за разделяне на произволно число на '0', тогава PL / SQL механизмът ще го хвърли като изключение. Изключението се повдига само по време на изпълнение от PL / SQL механизма.

Изключенията ще спрат изпълнението на програмата по-нататък, така че за да се избегне такова състояние, те трябва да бъдат уловени и обработени отделно. Този процес се нарича обработка на изключения, при който програмистът обработва изключението, което може да възникне по време на изпълнение.

В този урок ще научите следните теми -

  • Синтаксис за обработка на изключения
  • Видове изключения
  • Предварително дефинирани изключения
  • Дефинирано от потребителя изключение
  • PL / SQL Raise Exception
  • Важни моменти, които трябва да се отбележат в изключение

Синтаксис за обработка на изключения

Изключенията се обработват на ниво блок, т.е. веднъж, ако възникне някакво изключение в който и да е блок, контролата ще излезе от частта за изпълнение на този блок. Тогава изключението ще бъде обработено в частта за обработка на изключения от този блок. След обработка на изключението не е възможно да се изпрати отново контрола обратно в секцията за изпълнение на този блок.

Синтаксисът по-долу обяснява как да уловите и обработите изключението.

BEGIN… EXCEPTIONWHEN THENWHEN OTHERSTHENEND;

Обяснение на синтаксиса:

  • В горния синтаксис блокът за обработка на изключения съдържа поредица от условия WHEN за обработка на изключението.
  • Всяко условие WHEN е последвано от името на изключението, което се очаква да бъде повишено по време на изпълнение.
  • Когато някое изключение е повдигнато по време на изпълнение, тогава PL / SQL механизмът ще търси в частта за обработка на изключения за това конкретно изключение. Той ще започне от първата клауза „КОГА“ и последователно ще търси.
  • Ако е намерил обработката на изключения за изключението, което е било повдигнато, тогава ще изпълни конкретната част с код за обработка.
  • Ако няма нито една от клаузата „WHEN“ за изключението, което е повдигнато, тогава PL / SQL механизмът ще изпълни частта „WHEN OTHERS“ (ако има такава). Това е често срещано за всички изключения.
  • След изпълнението на изключението, контролът на части ще излезе от текущия блок.
  • Само една изключителна част може да бъде изпълнена за блок по време на изпълнение. След като го изпълни, контролерът ще пропусне останалата част за обработка на изключения и ще излезе от текущия блок.

Забележка: КОГА ДРУГИТЕ винаги трябва да са в последната позиция на последователността. Частта за обработка на изключения, налична след WHEN OTHERS, никога няма да бъде изпълнена, тъй като контролата ще излезе от блока след изпълнението WHEN OTHERS.

Видове изключения

Има два вида изключения в Pl / SQL.

  1. Предварително дефинирани изключения
  2. Дефинирано от потребителя изключение

Предварително дефинирани изключения

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 Преобразуването на знак в число не бе успешно поради невалиден цифров знак
NO_DATA_FOUND ORA-01403 Когато изразът 'SELECT', който съдържа клаузата INTO, не извлича редове.
ROW_MISMATCH 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, различни от предварително дефинираните изключения, програмистът може да създаде свое собствено изключение и да се справи с тях. Те могат да бъдат създадени на ниво подпрограма в частта за деклариране. Тези изключения са видими само в тази подпрограма. Изключението, което е дефинирано в спецификацията на пакета, е публично изключение и е видимо навсякъде, където пакетът е достъпен. <

Синтаксис: На ниво подпрограма

DECLARE EXCEPTION;BEGINEXCEPTIONWHEN  THENEND;
  • В горния синтаксис променливата „изключение_име“ се дефинира като тип „ИЗКЛЮЧЕНИЕ“.
  • Това може да се използва по подобен начин като предварително дефинирано изключение.

Синтаксис: На ниво спецификация на пакета

CREATE PACKAGE 
IS EXCEPTION;… END 
;
  • В горния синтаксис променливата „име_на изключение“ се дефинира като тип „ИЗКЛЮЧЕНИЕ“ в спецификацията на пакета на <име_пакет>.
  • Това може да се използва в базата данни навсякъде, където може да бъде извикан пакет „име_на_пакет“.

PL / SQL Raise Exception

Всички предварително дефинирани изключения се извеждат неявно, когато възникне грешката. Но дефинираните от потребителя изключения трябва да бъдат повдигнати изрично. Това може да бъде постигнато с помощта на ключовата дума „RAISE“. Това може да се използва по всеки от начините, споменати по-долу.

Ако 'RAISE' се използва отделно в програмата, тогава тя ще разпространи вече издигнатото изключение към родителския блок. Само в блок с изключения може да се използва, както е показано по-долу.

CREATE [ PROCEDURE | FUNCTION ]ASBEGINEXCEPTIONWHEN  THENRAISE;END;

Обяснение на синтаксиса:

  • В горния синтаксис ключовата дума RAISE се използва в блока за обработка на изключения.
  • Всеки път, когато програмата срещне изключение "изключение_име", изключението се обработва и ще бъде завършено нормално
  • Но ключовата дума 'RAISE' в частта за обработка на изключения ще разпространи това конкретно изключение към родителската програма.

Забележка: Докато повишаването на изключението към родителския блок изключението, което се повдига, също трябва да се вижда в родителския блок, иначе oracle ще изведе грешка.

  • Можем да използваме ключова дума „RAISE“, последвана от името на изключението, за да повдигнем това конкретно дефинирано от потребителя / предварително дефинирано изключение. Това може да се използва както в частта за изпълнение, така и в частта за обработка на изключения, за да се повдигне изключението.
CREATE [ PROCEDURE | FUNCTION ]ASBEGINRAISE EXCEPTIONWHEN  THENEND;

Обяснение на синтаксиса:

  • В горния синтаксис ключовата дума 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 изключения

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