Što je rukovanje iznimkama u PL / SQL-u?
Iznimka se događa kada PL / SQL mehanizam naiđe na naredbu koju ne može izvršiti zbog pogreške koja se dogodi u vrijeme izvođenja. Te se pogreške neće zabilježiti u vrijeme sastavljanja i stoga ih je bilo potrebno riješiti samo u vrijeme izvođenja.
Na primjer, ako PL / SQL mehanizam primi uputu za dijeljenje bilo kojeg broja s '0', tada će ga PL / SQL stroj izuzeti. Izuzetak pokreće PL / SQL mehanizam samo u vrijeme izvođenja.
Iznimke će zaustaviti daljnje izvršavanje programa, pa da bi se izbjeglo takvo stanje, potrebno ih je uhvatiti i rukovati odvojeno. Taj se postupak naziva rukovanjem iznimkama, u kojem programer obrađuje iznimku koja se može dogoditi u vrijeme izvođenja.
U ovom uputstvu naučit ćete sljedeće teme-
- Sintaksa rukovanja iznimkama
- Vrste izuzetaka
- Unaprijed definirane iznimke
- Korisnički definirana iznimka
- Iznimka za podizanje PL / SQL-a
- Važne napomene koje treba napomenuti u iznimci
Sintaksa rukovanja iznimkama
Iznimke se obrađuju na bloku, na razini, tj. Kada se dogodi bilo koja iznimka u bilo kojem bloku, tada će kontrola izaći iz izvršnog dijela tog bloka. Iznimka će se tada obrađivati u dijelu za rukovanje iznimkama tog bloka. Nakon obrade iznimke, nije moguće ponovno poslati kontrolu natrag u odjeljak izvršenja tog bloka.
Sintaksa u nastavku objašnjava kako uhvatiti i riješiti iznimku.
BEGIN… EXCEPTIONWHEN THEN WHEN OTHERSTHEN END;
Objašnjenje sintakse:
- U gornjoj sintaksi, blok za rukovanje iznimkama sadrži niz uvjeta WHEN za obradu iznimke.
- Svaki WHEN uvjet slijedi ime iznimke za koje se očekuje da će se povećati u vrijeme izvođenja.
- Kad se bilo koja iznimka pokrene tijekom izvođenja, tada će PL / SQL mehanizam potražiti u dijelu koji obrađuje iznimke za tu određenu iznimku. Započet će od prve klauzule "KADA" i uzastopno će pretraživati.
- Ako je pronašao rukovanje iznimkom za iznimku koja je pokrenuta, tada će izvršiti taj određeni dio koda za rukovanje.
- Ako nije navedena nijedna klauzula 'WHEN' za iznimku koja je pokrenuta, tada će PL / SQL mehanizam izvršiti dio 'WHEN OTHERS' (ako je prisutan). To je uobičajeno za sve iznimke.
- Nakon izvršavanja iznimke, kontrola dijelova će izaći iz trenutnog bloka.
- Samo jedan dio iznimke može se izvršiti za blok u vrijeme izvođenja. Nakon izvršenja, kontroler će preskočiti preostali dio koji obrađuje iznimke i izaći će iz trenutnog bloka.
Napomena: KADA OSTALI uvijek trebaju biti na posljednjem mjestu niza. Dio za rukovanje iznimkama prisutan nakon WHEN OTHERS nikada se neće izvršiti jer će kontrola izaći iz bloka nakon izvršavanja WHEN OTHERS.
Vrste izuzetaka
Postoje dvije vrste iznimki u Pl / SQL-u.
- Unaprijed definirane iznimke
- Korisnički definirana iznimka
Unaprijed definirane iznimke
Oracle je unaprijed definirao neku uobičajenu iznimku. Te iznimke imaju jedinstveno ime iznimke i broj pogreške. Te su iznimke već definirane u paketu 'STANDARD' u programu Oracle. U kodu možemo izravno koristiti ta unaprijed definirana imena iznimke za njihovo rukovanje.
Ispod je nekoliko unaprijed definiranih iznimaka
Iznimka | Kod pogreške | Razlog iznimke |
ACCESS_INTO_NULL | ORA-06530 | Dodijelite vrijednost atributima neinicijaliziranih objekata |
CASE_NOT_FOUND | ORA-06592 | Niti jedna klauzula 'WHEN' u CASE izjavi nije zadovoljena i nije navedena nijedna klauzula 'ELSE' |
COLLECTION_IS_NULL | ORA-06531 | Upotreba metoda sakupljanja (osim POSTOJI) ili pristupanje atributima zbirke na neinicijaliziranim zbirkama |
CURSOR_ALREADY_OPEN | ORA-06511 | Pokušaj otvaranja kursora koji je već otvoren |
DUP_VAL_ON_INDEX | ORA-00001 | Pohranjivanje dvostruke vrijednosti u stupac baze podataka koji je ograničen jedinstvenim indeksom |
INVALIDNI_KURSOR | ORA-01001 | Ilegalne operacije kursora poput zatvaranja neotvorenog kursora |
POGREŠAN BROJ | ORA-01722 | Pretvorba znaka u broj nije uspjela zbog nevaljanog znaka broja |
NE_PODATAK_NAĐEN | ORA-01403 | Kada izraz "SELECT" koji sadrži klauzulu INTO ne dohvaća redove. |
RED_NESAGLAŠENOST | ORA-06504 | Kada je tip podataka varijable kursora nekompatibilan sa stvarnim tipom povratka kursora |
SUBSCRIPT_BEYOND_COUNT | ORA-06533 | Navođenje zbirke indeksnim brojem koji je veći od veličine zbirke |
PRETPLATI SE_OUTSIDE_LIMIT | ORA-06532 | Navođenje zbirke indeksnim brojem koji je izvan zakonskog raspona (npr .: -1) |
TOO_MANY_ROWS | ORA-01422 | Kada izraz 'SELECT' s klauzulom INTO vrati više od jednog retka |
VALUE_ERROR | ORA-06502 | Aritmetička pogreška ili ograničenje veličine (npr .: dodjeljivanje vrijednosti varijabli koja je veća od veličine varijable) |
NULA_DIJELI | ORA-01476 | Dijeljenje broja s '0' |
Korisnički definirana iznimka
U Oracleu, osim prethodno unaprijed definiranih iznimki, programer može stvoriti vlastitu iznimku i rukovati njima. Mogu se kreirati na razini potprograma u dijelu deklaracije. Te su iznimke vidljive samo u tom potprogramu. Iznimka koja je definirana u specifikaciji paketa je javna iznimka i vidljiva je svugdje gdje je paketu dostupan. <
Sintaksa: na razini potprograma
DECLAREEXCEPTION;BEGIN EXCEPTIONWHEN THEN END;
- U gornjoj sintaksi, varijabla 'iznimka_ime' definirana je kao tip 'IZUZETKA'.
- To se može koristiti na sličan način kao unaprijed definirana iznimka.
Sintaksa: na razini specifikacija paketa
CREATE PACKAGEIS EXCEPTION;… END ;
- U gornjoj sintaksi, varijabla 'iznimka_ime' definirana je kao vrsta 'IZUZETAK' u specifikaciji paketa
. - To se može koristiti u bazi podataka gdje god se može nazvati paket 'ime_paketa'.
Iznimka za podizanje PL / SQL-a
Sve unaprijed definirane iznimke podrazumijevaju se implicitno kad god se pogreška dogodi. No, iznimke koje definira korisnik treba izričito podići. To se može postići korištenjem ključne riječi "PODIZI". To se može koristiti na bilo koji od dolje spomenutih načina.
Ako se 'RAISE' koristi zasebno u programu, tada će proširiti već podignutu iznimku na nadređeni blok. Samo u iznimnom bloku može se koristiti kako je prikazano u nastavku.
CREATE [ PROCEDURE | FUNCTION ]ASBEGINEXCEPTIONWHEN THEN RAISE;END;
Objašnjenje sintakse:
- U gornjoj sintaksi ključna riječ RAISE koristi se u bloku za rukovanje iznimkama.
- Kad god program naiđe na iznimku "iznimka_ime", s iznimkom se rukuje i dovršit će se normalno
- No, ključna riječ 'RAISE' u dijelu za rukovanje iznimkama proširit će ovu posebnu iznimku na nadređeni program.
Napomena: Dok podizanje iznimke na nadređeni blok, iznimka koja se podiže također treba biti vidljiva na nadređenom bloku, inače će Oracle izbaciti pogrešku.
- Možemo upotrijebiti ključnu riječ 'RAISE' iza koje slijedi ime iznimke da bismo pokrenuli tu određenu korisničku / unaprijed definiranu iznimku. To se može koristiti i u izvršnom dijelu i u dijelu za rukovanje iznimkama za podizanje iznimke.
CREATE [ PROCEDURE | FUNCTION ]ASBEGINRAISE EXCEPTIONWHEN THEN END;
Objašnjenje sintakse:
- U gornjoj sintaksi, ključna riječ RAISE koristi se u izvršnom dijelu nakon čega slijedi iznimka "iznimka_ime".
- To će pokrenuti ovu posebnu iznimku u vrijeme izvršenja, a to treba riješiti ili povećati dalje.
Primjer 1 : U ovom primjeru ćemo vidjeti
- Kako prijaviti iznimku
- Kako podići deklariranu iznimku i
- Kako ga proširiti u glavni blok
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:/
Objašnjenje koda:
- Redak koda 2 : Proglašavanje varijable 'sample_exception' tipom EXCEPTION.
- Redak koda 3 : Postupak deklariranja nested_block.
- 6. redak koda : Ispis izjave "Unutar ugniježđenog bloka".
- Redak koda 7: Ispis izjave "Podizanje sample_exception iz ugniježđenog bloka."
- Redak koda 8: Povećavanje iznimke pomoću 'RAISE sample_exception'.
- Redak koda 10: Obrađivač iznimki za iznimku sample_exception u ugniježđenom bloku.
- Redak koda 11: Ispis izraza 'Iznimka zabilježena u ugniježđeni blok. Podizanje u glavni blok '.
- Redak koda 12: Podizanje iznimke u glavni blok (širenje u glavni blok).
- Redak koda 15: Ispis izjave "Unutar glavnog bloka".
- Redak koda 16: Ispis izjave "Pozivanje ugniježđenog bloka".
- Redak koda 17: Pozivanje postupka nested_block.
- Redak koda 19: Obrađivač izuzetaka za sample_exception u glavnom bloku.
- Redak koda 20: Ispis izjave "Iznimka zabilježena u glavnom bloku."
Važne napomene koje treba napomenuti u iznimci
- U funkciji, iznimka bi uvijek trebala ili vratiti vrijednost ili dodatno povisiti iznimku. inače će Oracle u vrijeme izvođenja baciti pogrešku "Funkcija vraćena bez vrijednosti".
- Izvodi o kontroli transakcija mogu se dati u bloku za rukovanje iznimkama.
- SQLERRM i SQLCODE su ugrađene funkcije koje će dati poruku i kôd iznimke.
- Ako se ne obradi iznimka, tada će se prema zadanim postavkama sve aktivne transakcije u toj sesiji vratiti.
- RAISE_APPLICATION_ERROR (-
, ) može se koristiti umjesto RAISE za podizanje pogreške s korisničkim kodom i porukom. Kôd pogreške trebao bi biti veći od 20000 i imati prefiks '-'.
Sažetak
Nakon ovog poglavlja. trebali biste biti u mogućnosti raditi na sljedećim aspektima Pl SQL iznimaka
- Rukovanje iznimkama
- Definirajte iznimku
- Povećajte iznimku
- Razmnožavanje iznimke