complete guide pl sql exception handling with examples
Този урок обяснява PL SQL обработка на изключения и свързани понятия като видове изключения, дефинирани от потребителя и дефинирани от системата изключения, как да се създаде изключение и т.н.:
В PL / SQL формат за дата и час на PL / SQL серия , научихме за някои полезни функции около Datetime, Timestamp и Interval
В тази статия ще обсъдим обработката на изключения в PL SQL. Също така ще проучим предимствата на изключенията и как да ги създадем.
Нека започнем с ученията !!
Какво ще научите:
PL SQL обработка на изключения
Грешка или предупредително събитие се нарича изключение. Среща се по време на изпълнение на изпълнението на PL / SQL програмата. PL / SQL има механизми за обработка на тези изключителни условия с помощта на блока EXCEPTION на кода, където е дефинирано как да се противодейства на условието за грешка.
Има два вида изключения. Те са изброени по-долу:
- Дефинирани от потребителя изключения.
- Дефинирани от системата изключения.
Някои от популярните дефинирани от системата изключения са недостиг на памет и деление на нула, като има имена като STORAGE_ERROR и ZERO_DIVIDE съответно. Дефинираните от потребителя изключения се декларират в пакет, подпрограма или в раздела за деклариране на PL / SQL блока с код и трябва да им бъдат присвоени имена.
След като възникне изключение, естественият поток на изпълнение се спира и след това изпълнението сочи към раздела за изключения на PL / SQL кода. Докато дефинираните от системата изключения се изхвърлят по подразбиране, дефинираните от потребителя трябва да бъдат хвърлени изрично от ключовата дума RAISE.
По този начин обработката на изключения помага да се справите с грешките, които се срещат по време на изпълнението, а не по време на компилирането на програмата.
Предимства на обработката на изключения
Предимствата са изброени по-долу:
- Ако нашият код няма обработка на изключения, тогава всеки път, когато изпълняваме оператор, трябва да проверяваме грешки в изпълнението.
- Ако избягваме обработката на изключения в нашия код, действителните грешки се пропускат, което води до някои други грешки.
- Обработката на изключения позволява пропускане на множество проверки в кода.
- Той осигурява по-добра четливост на кода, като изолира обработващите грешки в кода.
Синтаксис за обработка на изключения:
DECLARE <> BEGIN < > EXCEPTION <> WHEN excp1 THEN <> WHEN excp2 THEN <> ........ WHEN others THEN <> END;
Изключението по подразбиране се извършва с КОГАТО други ТОГАВА.
Нека разгледаме таблица, която е именувана ГРАЖДАНИН .
SELECT * FROM CITIZEN;
Създадохме таблицата CITIZEN с помощта на SQL израза, даден по-долу.
CREATE TABLE CITIZEN ( ID INT NOT NULL, NAME VARCHAR (15) NOT NULL, AGE INT NOT NULL, PRIMARY KEY (ID) );
Вмъкнете стойности в тази таблица с SQL изрази, дадени по-долу:
INSERT INTO CITIZEN VALUES (1, 'ZAKS', 14); INSERT INTO CITIZEN VALUES (8, 'RANNY', 75); INSERT INTO CITIZEN VALUES (5, 'TOM', 37);
Прилагане на кодиране с обработка на изключения:
DECLARE citizen_id citizen.id%type; citizen_name citizen.name%type; citizen_age citizen.age%type := 9; BEGIN SELECT id, name INTO citizen_id, citizen_name FROM citizen WHERE age = citizen_age; DBMS_OUTPUT.PUT_LINE ('Citizen id is: '|| citizen_id); DBMS_OUTPUT.PUT_LINE ('Citizen name is: '|| citizen_name); EXCEPTION WHEN no_data_found THEN dbms_output.put_line ('No citizen detail found'); WHEN others THEN dbms_output.put_line ('Errors'); END; /
Резултатът от горния код:
В горния код, тъй като в таблицата CITIZEN няма граждани на 9-годишна възраст, се повдига изключение по време на работа.
Повишаване на изключение в PL / SQL
Изключение може да бъде създадено от разработчиците изрично с помощта на ключовата дума RAISE.
Синтаксисът за повишаване на изключения:
DECLARE exception_n EXCEPTION; BEGIN IF condition THEN RAISE exception_n; END IF; EXCEPTION WHEN exception_n THEN <>; END;
Тук изключението_n е името на изключението, което повдигаме. По този начин можем да създадем както дефинирани от потребителя, така и дефинирани от системата изключения.
Дефинирано от потребителя изключение
Разработчиците могат да създадат свои собствени изключения и да ги използват за обработка на грешки. Те могат да бъдат създадени в декларационната част на подпрограма и могат да бъдат достъпни само вътре в тази подпрограма.
Изключение, което се създава на ниво пакет, може да се използва при всеки достъп до пакета. Дефинирано от потребителя изключение може да бъде създадено с помощта на ключовата дума RAISE.
Синтаксисът на дефинирана от потребителя грешка е:
DECLARE exception_n EXCEPTION;
Ето, изключение_n е името на изключението, което вдигаме. По този начин можем да декларираме изключение, като дадем име, последвано от ключовата дума EXCEPTION. Изключение може да бъде декларирано по подобен начин като декларираните променливи. Изключение обаче е неочаквано състояние, а не елемент от данни.
Обхват на изключението в PL / SQL:
Правилата за обхват на PL / SQL изключение са изброени по-долу:
- Изключение не може да бъде декларирано повече от веднъж в един и същ блок от код. Но можем да декларираме едно и също изключение в два различни блока код.
- Изключение, декларирано в рамките на блок от код, е локално в рамките на този блок и глобално за всеки подблок.
- Ако отново декларираме глобално изключение в подблок, локалната декларация отменя.
Нека отново разгледаме таблица, която носи името CITIZEN.
Внедряване на код с дефинирани от потребителя изключения:
DECLARE firstexception EXCEPTION; j NUMBER; BEGIN FOR j IN (SELECT * FROM CITIZEN) LOOP IF j.ID = 8 THEN RAISE firstexception; END IF; END LOOP; EXCEPTION WHEN firstexception THEN dbms_output.put_line ('Citizen with ID 8 already exist in table.'); END; /
Резултатът от горния код:
Предварително дефинирано изключение
В нарушение на правилата на базата данни или надхвърляне на зависимия от системата праг, автоматично се извежда вътрешно изключение. Всички тези грешки имат уникален номер и всяко изключение се дефинира като име. Например, PL / SQL хвърля предварително дефинирано изключение NO_DATA_FOUND, когато заявка SELECT не извлича редове.
Всички предварително дефинирани изключения на PL / SQL са декларирани в пакета STANDARD, който се занимава с PL / SQL средата.
Изключение | Грешка в Oracle | SQL КОД | Описание |
---|---|---|---|
НЕВАЛИДЕН НОМЕР | ВРЕМЕ - 01722 | -1722 | Това изключение се повдига, ако преобразуването в символен низ в число не преминава, тъй като низът представлява невалидно число. |
ACCESS_INTO_NULL | СЕГА - 06530 | -6530 | Това изключение се повдига, ако на нулев обект естествено е присвоена стойност. |
CASE_NOT_FOUND | СЕГА - 06592 | -6592 | Това изключение се повдига, ако не е избрана нито една от опциите в клаузата WHEN и не съществува клауза ELSE. |
COLLECTION_IS_NULL | СЕГА - 06531 | -6531 | Това изключение се повдига, когато кодът се опитва да приложи методи за събиране с изключение на EXISTS към вложена таблица или масив, който не е инициализиран. Може да се повиши и ако нашият код се опитва да присвоява стойности на вложена таблица или масив, който не е инициализиран. |
DUP_VAL_ON_INDEX | ВРЕМЕ - 00001 | -1 | Това изключение се повдига, ако се опитват да се съхраняват дублирани стойности в колона, ограничена от уникален индекс. |
CURSOR_ALREADY_OPEN | СЕГА - 06511 | -6511 | Това изключение се повдига, ако нашият код се опита да отвори вече отворен курсор. |
INVALID_CURSOR | ВРЕМЕ - 01001 | -1001 | Това изключение се повдига, ако се опитаме да извършим някои операции с курсори, които не са разрешени. Например, опит за затваряне на вече затворен курсор. |
LOGIN_DENIED | ВРЕМЕ - 01017 | -1017 | Това изключение се повдига, ако програмата се опита да влезе в базата данни с неправилно потребителско име и парола. |
NO_DATA_FOUND | ВРЕМЕ - 01403 | 100 | Това изключение се повдига, ако заявка SELECT не извлича редове. |
NOT_LOGGED_ON | ВРЕМЕ - 01012 | -1012 | Това изключение се повдига, ако се опитаме да извършим операция с база данни, без да се свързваме с нея. |
PROGRAM_ERROR | ВРЕМЕ - 06501 | -6501 | Това изключение се повдига, ако PL / SQL програмата е срещнала вътрешна грешка. |
ROWTYPE_MISMATCH | ВРЕМЕ - 06504 | -6504 | Това изключение се повдига, ако курсор се опитва да върне стойности към променлива с несъвместим тип данни. |
SELF_IS_NULL | СЕГА - 30625 | -30625 | Това изключение се повдига, ако метод член е извикан без инициализиране на неговия тип обект. |
STORAGE_ERROR | СЕГА - 06500 | -6500 | Това изключение се повдига, ако PL / SQL програмата остане без памет или паметта й се повреди по време на изпълнение. |
TOO_MANY_ROWS | ВРЕМЕ - 01422 | -1422 | Това изключение се повдига, ако заявка SELECT извлича множество редове. |
SUBSCRIPT_BEYOND_COUNT | СЕГА - 06533 | -6533 | Това изключение се повдига, ако индексът е повече от общия брой на елементите в колекцията. |
АБОНИРАЙТЕ_OUTSIDE_LIMIT | СЕГА - 06532 | -6532 | Това изключение се повдига, ако индексът е извън границата на прага. |
SYS_INVALID_ROWID | ORA-01410 | -1410 | Това изключение се повдига, ако преобразуването в символен низ в универсален идентификатор на ред не преминава, тъй като символният низ представлява невалиден идентификатор на ред. |
TIMEOUT_ON_RESOURCE | ORA-00051 | -51 | Това изключение се повдига, ако Oracle чака ресурс. |
VALUE_ERROR | ORA-06502 | -6502 | Това изключение се повдига, ако в нашата програма се случи математическа грешка, грешка при преобразуване или отрязване. |
ZERO_DIVIDE | ORA-01476 | -1476 | Това изключение се повдига, ако се опитаме да разделим число на 0. |
Често задавани въпроси и отговори
В # 1) Какво е предварително дефинирано изключение в PL / SQL?
Отговор: Предварително дефинирано изключение се изхвърля от PL / SQL автоматично, ако има нарушение на правилата на базата данни от програма.
В # 2) Какво представлява PL / SQL обработката на изключения и защо е необходимо?
как да настроите фалшив имейл
Отговор: Грешка или неочаквано събитие в програмата се нарича изключение. Това спира нормалния поток на изпълнение на програмата. В PL / SQL изключението се обработва в рамките на блок EXCEPTION в кода и правилното действие срещу изключението е описано вътре в този блок.
В # 3) Какво се разбира под обработка на изключения?
Отговор: Това е методът за реагиране на неочаквани събития, които могат да възникнат по време на изпълнение на кода.
В # 4) Какви са двете форми на обработка на грешки?
Отговор: Двете форми за обработка на грешки включват грешка по време на компилация и грешка във времето на изпълнение . Грешката във времето на изпълнение се случва по време на изпълнението на програмата поради неправилни данни или логика. Грешките по време на компилация се улавят по време на компилирането на нашия код.
В # 5) Каква е разликата между грешка и изключение?
Отговор: Изключения са инциденти, които се обработват с помощта на блока try / catch и могат да се срещнат както по време на компилация, така и по време на изпълнение на програмата. Грешките, от друга страна, се срещат само по време на изпълнение.
Заключение
В този урок обсъдихме подробно някои основни концепции на PL / SQL, които са от съществено значение за управлението на изключенията в нашите програми.
Покрихме следните теми, изброени по-долу:
- Изключения.
- Видове изключения.
- Някои предварително дефинирани изключения.
В следващия урок ще обсъдим PL / SQL транзакциите, OOPS концепциите и много други свързани теми.
Препоръчително четене
- C # Урок за обработка на изключения с примери за кодове
- Изключения на Java и обработка на изключения с примери
- PL SQL пакет: Урок за Oracle PL / SQL пакет с примери
- Обработка на изключения в C ++
- PL SQL Урок за начинаещи с примери | Какво е PL / SQL
- PL SQL Records Урок с примери