Какво представлява обработката на изключения в PL / SQL?
Изключение се случва, когато PL / SQL механизмът срещне инструкция, която не може да изпълни поради грешка, която възниква по време на изпълнение. Тези грешки няма да бъдат уловени по време на компилацията и следователно те трябва да бъдат обработвани само по време на изпълнение.
Например, ако PL / SQL механизмът получи инструкция за разделяне на произволно число на '0', тогава PL / SQL механизмът ще го хвърли като изключение. Изключението се повдига само по време на изпълнение от PL / SQL механизма.
Изключенията ще спрат изпълнението на програмата по-нататък, така че за да се избегне такова състояние, те трябва да бъдат уловени и обработени отделно. Този процес се нарича обработка на изключения, при който програмистът обработва изключението, което може да възникне по време на изпълнение.
В този урок ще научите следните теми -
- Синтаксис за обработка на изключения
- Видове изключения
- Предварително дефинирани изключения
- Дефинирано от потребителя изключение
- PL / SQL Raise Exception
- Важни моменти, които трябва да се отбележат в изключение
Синтаксис за обработка на изключения
Изключенията се обработват на ниво блок, т.е. веднъж, ако възникне някакво изключение в който и да е блок, контролата ще излезе от частта за изпълнение на този блок. Тогава изключението ще бъде обработено в частта за обработка на изключения от този блок. След обработка на изключението не е възможно да се изпрати отново контрола обратно в секцията за изпълнение на този блок.
Синтаксисът по-долу обяснява как да уловите и обработите изключението.
BEGIN… EXCEPTIONWHEN THEN WHEN OTHERSTHEN END;
Обяснение на синтаксиса:
- В горния синтаксис блокът за обработка на изключения съдържа поредица от условия WHEN за обработка на изключението.
- Всяко условие WHEN е последвано от името на изключението, което се очаква да бъде повишено по време на изпълнение.
- Когато някое изключение е повдигнато по време на изпълнение, тогава PL / SQL механизмът ще търси в частта за обработка на изключения за това конкретно изключение. Той ще започне от първата клауза „КОГА“ и последователно ще търси.
- Ако е намерил обработката на изключения за изключението, което е било повдигнато, тогава ще изпълни конкретната част с код за обработка.
- Ако няма нито една от клаузата „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 | Използване на методи за събиране (с изключение на 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, различни от предварително дефинираните изключения, програмистът може да създаде свое собствено изключение и да се справи с тях. Те могат да бъдат създадени на ниво подпрограма в частта за деклариране. Тези изключения са видими само в тази подпрограма. Изключението, което е дефинирано в спецификацията на пакета, е публично изключение и е видимо навсякъде, където пакетът е достъпен. <
Синтаксис: На ниво подпрограма
DECLAREEXCEPTION;BEGIN EXCEPTIONWHEN THEN END;
- В горния синтаксис променливата „изключение_име“ се дефинира като тип „ИЗКЛЮЧЕНИЕ“.
- Това може да се използва по подобен начин като предварително дефинирано изключение.
Синтаксис: На ниво спецификация на пакета
CREATE PACKAGEIS EXCEPTION;… END ;
- В горния синтаксис променливата „име_на изключение“ се дефинира като тип „ИЗКЛЮЧЕНИЕ“ в спецификацията на пакета на <име_пакет>.
- Това може да се използва в базата данни навсякъде, където може да бъде извикан пакет „име_на_пакет“.
PL / SQL Raise Exception
Всички предварително дефинирани изключения се извеждат неявно, когато възникне грешката. Но дефинираните от потребителя изключения трябва да бъдат повдигнати изрично. Това може да бъде постигнато с помощта на ключовата дума „RAISE“. Това може да се използва по всеки от начините, споменати по-долу.
Ако '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 изключения
- Обработка на изключенията
- Определете изключение
- Повишете изключението
- Разпространение на изключения