Научете как да обработвате изключения в PL / SQL



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

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

Обработка на SQL-изключения в PL / SQL-EdurekaПо-долу са разгледани темите в тази статия:





Какво е изключение?

Всяко ненормално състояние или събитие, което прекъсва нормалния поток на нашите програмни инструкции по време на изпълнение или с прости думи изключение е грешка.

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

ДЕКЛАРИРАЙТЕ НАЧАЛО НА ИЗКЛЮЧЕНИЕ КОГА изключение1 ТОГА изключение1-обработка-изявления КОГА изключение2 ТОГА изключение2-обработка-изявления КОГА изключение3 ТОГА изключение3-обработка-изявления ........ КОГА други ТОГА изключение3-обработка-изявления КРАЙ

Тук можем да изброим толкова изключения, колкото искаме да обработим. Изключението по подразбиране ще бъде обработено с помощта на „WHEN others THEN“



Пример за обработка на изключения в PL / SQL

Програмата по-долу показва името и адреса на студент, чийто идентификационен номер е даден. Тъй като в нашата база данни няма ученик със стойност на ID 8, програмата повдига изключение по време на изпълнение NO_DATA_FOUND, което се улавя в блока EXCEPTION.

ОБЯВЕТЕ s_id studentS.id% type: = 8 s_name studentS.Name% type s_loc studentS.loc% type BEGIN SELECT name, loation INTO s_name, s_loc FROM students WHERE id = s_id DBMS_OUTPUT.PUT_LINE ('Name:' || s_name) DBMS_OUTPUT .PUT_LINE ('Местоположение:' || s_loc) ИЗКЛЮЧЕНИЕ КОГАТО no_data_found THEN dbms_output.put_line ('Няма такъв студент!') КОГА други THEN dbms_output.put_line ('Ами сега, грешка!') END

Изход

Няма такъв студент! PL / SQL процедура успешно завършена.

Тук можем да изброим толкова изключения, колкото искаме да обработим. Изключението по подразбиране ще бъде обработено с помощта на „ КОГАТО други ТОГАВА '

програма за двоично търсене в Java

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

  • Дефинирана система
  • Потребителят се противопостави

Следва в тази статия за обработка на изключения в PL / SQL , нека обсъдим подробно и двата вида.



Дефинирана система

Дефинирани и поддържани имплицитно от сървъра на Oracle, тези изключения са дефинирани главно в стандартния пакет Oracle. Всеки път, когато възникне изключение в програмата, сървърът на Oracle съвпада и идентифицира подходящото изключение от наличния набор от изключения, наличен в стандартния пакет на Oracle. По принцип тези изключения са предварително дефинирани в PL / SQL което се повдига КОГАТО е нарушено конкретно правило на базата данни .

The Дефинирани от системата изключения са разделени на две категории:

  • Именувани системни изключения
  • Неназовани системни изключения

Именувани системни изключения

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

Изключение Грешка в Oracle SQLCODE Описание
ACCESS_INTO_NULL06530-6530Повишава се, когато на нулев обект автоматично се присвоява стойност.
CASE_NOT_FOUND06592-6592Повишава се, когато нито един от изборите в клаузата WHEN на a Декларация CASE е избрано и няма клауза ELSE.
COLLECTION_IS_NULL06531-6531Повишава се, когато програма се опитва да приложи методи за събиране, различни от EXISTS, към неинициализирана вложена таблица или масив или програмата се опитва да присвоява стойности на елементите на неинициализирана вложена таблица или масив.
DUP_VAL_ON_INDEX00001-единПовишава се, когато се опитват да се съхраняват дублирани стойности в колона с уникален индекс.
INVALID_CURSOR01001-1001Повишава се, когато се правят опити за извършване на операция с курсор, която не е разрешена, като например затваряне на неотворен курсор.
НЕВАЛИДЕН НОМЕР01722-1722Повишава се, когато преобразуването на символен низ в число се провали, тъй като низът не представлява валидно число.
LOGIN_DENIED01017-1017Повишава се, когато програма се опита да влезе в базата данни с невалидно потребителско име или парола.
NO_DATA_FOUND01403+100Повишава се, когато операторът SELECT INTO не връща редове.
NOT_LOGGED_ON01012-1012Повишава се, когато се извика повикване към база данни, без да е свързано с базата данни.
PROGRAM_ERROR06501-6501Повишава се, когато PL / SQL има вътрешен проблем.
ROWTYPE_MISMATCH06504-6504Повишава се, когато курсорът извлича стойност в променлива с несъвместим тип данни.
SELF_IS_NULL30625-30625Повишава се при извикване на метод член, но екземплярът на типа обект не е инициализиран.
STORAGE_ERROR06500-6500Повишава се, когато PL / SQL остане без памет или паметта е повредена.
TOO_MANY_ROWS01422-1422Повишава се, когато операторът SELECT INTO връща повече от един ред.
VALUE_ERROR06502-6502Повишава се, когато възникне грешка в аритметика, преобразуване, отрязване или ограничение на размера.
ZERO_DIVIDE014761476Вдига се, когато се прави опит да се раздели число на нула.

Пример

СЪЗДАЙТЕ ИЛИ ЗАМЕНЕТЕ ПРОЦЕДУРА add_new_student (student _id_in В НОМЕР, student _name_in В VARCHAR2) Е НАЧАЛО ВЪВЕЖДАНЕ В student (student _id, student _name) ЦЕННОСТИ (student _id_in, student _name_in) ИСКЛЮЧЕНИЕ, КОГАТО DUP_VAL_ON_INDEX THEN увеличение DAP_er Dup_Deple_up_Deple_up_Deple_Deper_Deple_up_Denice_Deper _up_Deple _up_Deple_Deper_Deper_Deper_Deper_up_Deple_Dap_Deple_Dap_Deple_Dap_EnDEX THEN ) КОГА ДРУГИ ТОГАВА error_application_error (-20002, 'Възникна грешка.') END

Продължавайки в тази статия за обработка на изключения в PL / SQL, нека разберем какви са неназованите системни изключения.

Неименувани системни изключения

Системните изключения, за които Oracle няма име, са известни като неназовани системни изключения. Тези изключения не се срещат често и се пишат с код и свързано съобщение.

По принцип има два начина за справяне с неназовани системни изключения:

1. Използване на манипулатора на изключения WHEN OTHERS

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

Някои стъпки, следвани за неназовани системни изключения, са:

  • Вдигнете ги имплицитно.
  • В случай че тогава не се обработват в „КОГА други“, те трябва да бъдат обработени изрично.
  • За да се справят изрично с изключението, те могат да бъдат декларирани с помощта на Pragma EXCEPTION_INIT и обработени чрез позоваване на дефинираното от потребителя име на изключение в раздела за изключения.

Пример за работа с неназовани изключения с помощта на Pragma EXCEPTION_INIT е предоставен по-късно в статията. Продължавайки в тази статия за обработка на изключения в PL / SQL, нека разберем дефинираните от потребителя изключения.

Потребителски дефиниран

Подобно на всички други езици за програмиране, Oracle също ви позволява да декларирате, че рекламата изпълнява вашите собствени изключения. За разлика от дефинираните от системата изключения, тези изключения са повдигнати изрично в блока PL / SQL.

Стъпки за деклариране на дефинирани от потребителя изключения в базата данни на Oracle

Можем да дефинираме дефинирани от потребителя изключения в базата данни на Oracle по следните 3 начина:

  • Използване на променлива от тип EXCEPTION

Тук можем да декларираме дефинирано от потребителя изключение, като декларираме променлива на EXCEPTION тип данни в нашия код и го повдигнете изрично в нашата програма, използвайки изявление RAISE.

  • Използване на функцията PRAGMA EXCEPTION_INIT

Можем да дефинираме недефиниран номер на грешка с променливата на тип данни EXCEPTION

  • Използване на метод RAISE_APPLICATION_ERROR

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

Досега може би сте имали приблизителна представа за начините, по които можем да създадем дефинирани от потребителя изключения в PL / SQL. Ще научим за всеки от гореспоменатите методи с примери по-нататък в тази статия за обработка на изключения в PL / SQL.

След това в тази статия нека продължим с демонстрациите на дефинирана от потребителя обработка на изключения.

Демонстрация на дефинирани от потребителя изключения

Продължавайки в тази статия за обработка на изключения в PL / SQL, нека разберем как да използваме променливата от тип EXCEPTION.

Използване на променлива от тип EXCEPTION

Процесът на деклариране на дефинирано от потребителя изключение е разделен на три части и тези 3 части са:

  • Декларирайте променлив тип данни за изключение
  • Повишете изключението
  • Обработвайте изключението

Нека напишем код, за да демонстрираме подробно горните стъпки.

ДЕКЛАРИРАТЕ var_dividend НОМЕР: = 10 var_divisor НОМЕР: = 0 var_result НОМЕР ex-DivZero ИЗКЛЮЧЕНИЕ

В горния блок за деклариране имаме четири променливи, сред които първите три са променливи на типа данни с нормално число, а четвъртата, която е ex_DivZero, е специалната променлива на типа данни за изключение. Четвъртото е нашето дефинирано от потребителя изключение.

ДЕКЛАРИРАТЕ var_dividend НОМЕР: = 10 var_divisor НОМЕР: = 0 var_result НОМЕР ex-DivZero ИЗКЛЮЧЕНИЕ

Горната част за изпълнение на този анонимен блок ще влезе в действие само когато делителят е 0. Ако делителят е нула, както е в нашия случай, грешката ще бъде повдигната и контролът на програмата ще пропусне всички следващи стъпки и ще търси съвпадащ манипулатор на изключения. В случай, че намери друго, то ще извърши съответното действие, в противен случай или ще прекрати програмата, или ще ни подкани с необработена системно дефинирана грешка.

урок за sql и pl sql
ИЗКЛЮЧЕНИЕ КОГА ex_DivZero ТОГАВА DBMS_OUTPUT.PUT_LINE (‘ГРЕШКА, делителят не може да бъде нула’)

Това е манипулаторът на изключения. Веднага след като потребителят въведе делител като 0, ще бъде подканен горният низ от съобщения.

Окончателен код:

DECLARE var_dividend NUMBER: = 10 var_divisor NUMBER: = 0 var_result NUMBER ex-DivZero ИЗКЛЮЧВАНЕ НАЧАЛО АКО var_divisor = 0 THEN RAISE ex-DivZero END IF Var_result: = var_dividend / var_divisor DBMS_OUTPUT.PUT_LINE ('RESult IF = RESID' RESIN = 0 THEN RAISE ex-DivZero END IF Var_result: = var_dividend / var_divisor DBMS_OUTPUT.PUT_LINE ('Резултат =' || var_result) END

Продължавайки в тази статия за обработка на изключения в PL / SQL, нека разберем как да използваме метода PRAGMA_EXCEPTION_INIT.

Използване на функцията PRAGMA EXCEPTION_INIT

В PRAGMA EXCEPTION_INIT функция, име на изключение е свързано с номер на грешка на Oracle. Това име може да се използва при проектирането на манипулатора на изключения за грешката.За огромни проекти с много дефинирани от потребителя грешки, PRAGMA EXCEPTION_INIT е най-полезният и подходящ метод.

Синтаксис:

PRAGMA EXCEPTION_INIT (име на изключение, -Oracle_error_number)

Пример

DECLARE deadlock_detected ИЗКЛЮЧЕНИЕ PRAGMA EXCEPTION_INIT (deadlock_detected, -60) BEGIN NULL - Някои операции, които причиняват грешка ORA-00060 EXCEPTION WHEN deadlock_detected THEN NULL - обработване на грешката END

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

Продължавайки в тази статия за обработка на изключения в PL / SQL, нека разберем как да използваме метода RAISE_APPLICATION_ERROR.

Използване на метод RAISE_APPLICATION_ERROR

Това е процедура, която се вгражда със софтуера oracle. Използвайки тази процедура, можем да свържем номер на грешка с персонализирано съобщение за грешка. Комбинирайки както номера на грешката, така и персонализираното съобщение за грешка, може да бъде съставен низ за грешка, който изглежда подобно на тези низове за грешка по подразбиране, които се показват от oracle, когато се срещне грешка. Процедурата RAISE_APPLICATION_ERROR се намира в пакета DBMS_STANDARD

Синтаксис

error_application_error (номер_грешка, съобщение [, TRUE])

Пример

/ * Създава се тригер trg_emp_detail_chk. * / СЪЗДАЙТЕ ИЛИ ЗАМЕНЕТЕ TRIGGER trg_emp_detail_chk / * Времето на задействането се декларира като ПРЕДИ АКТУАЛИЗИРАНЕ в таблицата НА СЛУЖИТЕ. денят от системното време е или събота, или неделя, или не. * / АКО подстригване (TO_CHAR (sysdate, 'Day')) IN ('събота', 'неделя') ТОГА rise_application_error (-20000, 'Нямате право да правите всяка промяна през уикендите !! ') / * Процедурата rise_application_error се извиква със стойността на първия параметър като -20000, а с втория параметър с текст по подразбиране, в който се посочва, че потребителят няма право да извършва каквито и да е промени през уикендите. * / END IF END

С това стигнахме до края на тази статия за „Обработка на изключения в PL / SQL“. Надявам се тази тема да се разбере добре и да ви е помогнала. Опитайте се да напишете свои собствени кодове и да включите методите, обяснени в тази статия.

Ако искате да се обучите от професионалисти по тази технология, можете да изберете структурирано обучение от edureka! Вижте това от Edureka, доверена компания за онлайн обучение с мрежа от над 250 000 доволни учащи, разпространени по целия свят. Този курс ви обучава на основните концепции и усъвършенствани инструменти и техники за управление на данни и администриране на базата данни MySQL. Включва практическо обучение по концепции като MySQL Workbench, MySQL Server, Моделиране на данни, MySQL Connector, Дизайн на база данни, MySQL команден ред, MySQL функции и др. В края на обучението ще можете да създадете и администрирате своя собствена MySQL база данни и да управлявате данни.

Имате въпрос към нас? Моля, споменете го в раздела за коментари на тази статия „Обработка на изключения в PL / SQL“ и ние ще се свържем с вас възможно най-скоро.