Upravljanje iznimkama Oracle PL/SQL (primjeri)
Što je rukovanje iznimkama u PL/SQL?
Iznimka se događa kada PL/SQL mehanizam naiđe na instrukciju koju ne može izvršiti zbog greške koja se javlja tijekom izvođenja. Ove pogreške neće biti uhvaćene u vrijeme kompilacije i stoga ih je potrebno obraditi samo u vrijeme izvođenja.
Na primjer, ako PL/SQL stroj primi instrukciju za dijeljenje bilo kojeg broja s '0', tada će PL/SQL stroj to izbaciti kao iznimku. Iznimku pokreće PL/SQL motor 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 njima zasebno. Taj se proces naziva rukovanje iznimkama, u kojem programer obrađuje iznimke koje se mogu pojaviti tijekom izvođenja.
Sintaksa rukovanja iznimkama
Iznimke se obrađuju na razini bloka, tj. jednom, ako se dogodi bilo kakva iznimka u bilo kojem bloku, tada će kontrola izaći iz izvršnog dijela tog bloka. Iznimka će se zatim obraditi u dijelu za rukovanje iznimkama tog bloka. Nakon obrade iznimke, nije moguće ponovno poslati kontrolu natrag u odjeljak za izvršavanje tog bloka.
Donja sintaksa objašnjava kako uhvatiti i rukovati iznimkom.
BEGIN <execution block> . . EXCEPTION WHEN <exceptionl_name> THEN <Exception handling code for the “exception 1 _name’' > WHEN OTHERS THEN <Default exception handling code for all exceptions > END;
Objašnjenje sintakse:
- U gornjoj sintaksi, blok za rukovanje iznimkom sadrži niz uvjeta KADA za obradu iznimke.
- Nakon svakog uvjeta WHEN slijedi naziv iznimke za koju se očekuje da će biti pokrenuta u vrijeme izvođenja.
- Kada se tijekom izvođenja pojavi bilo koja iznimka, tada će PL/SQL motor tražiti tu iznimku u dijelu za rukovanje iznimkom. Počet će od prve klauzule 'WHEN' i pretraživat će redom.
- Ako je pronašao rukovanje iznimkom za iznimku koja je podignuta, tada će izvršiti taj određeni dio koda za rukovanje.
- Ako niti jedna klauzula 'WHEN' nije prisutna za izuzetak koji je podignut, tada će PL/SQL motor izvršiti dio 'WHEN OTHERS' (ako postoji). To je uobičajeno za sve iznimke.
- Nakon izvršenja iznimke, kontrola dijela će izaći iz trenutnog bloka.
- Samo jedan dio iznimke može se izvršiti za blok tijekom izvođenja. Nakon što ga izvrši, kontroler će preskočiti preostali dio rukovanja iznimkom i izaći iz trenutnog bloka.
Bilješka: WHEN OTHERS uvijek treba biti na zadnjoj poziciji niza. Dio za rukovanje iznimkama koji je prisutan nakon WHEN OTHERS nikada se neće izvršiti jer će kontrola izaći iz bloka nakon izvršavanja WHEN OTHERS.
Vrste iznimki
Postoje dvije vrste iznimaka u Pl/SQL.
- Unaprijed definirane iznimke
- Korisnički definirana iznimka
Unaprijed definirane iznimke
Oracle ima unaprijed definiranu uobičajenu iznimku. Ove iznimke imaju jedinstveni naziv iznimke i broj pogreške. Ove su iznimke već definirane u paketu 'STANDARD' u Oracle. U kodu možemo izravno upotrijebiti te unaprijed definirane nazive iznimki da bismo ih obradili.
Ispod je nekoliko unaprijed definiranih izuzetaka
izuzetak | Kod pogreške | Razlog iznimke |
---|---|---|
ACCESS_INTO_NULL | ORA-06530 | Dodijelite vrijednost atributima neinicijaliziranih objekata |
SLUČAJ_NIJE_PRONAĐEN | ORA-06592 | Nijedna klauzula 'WHEN' u izjavi CASE nije zadovoljena i nije navedena klauzula 'ELSE' |
COLLECTION_IS_NULL | ORA-06531 | Korištenje metoda zbirke (osim EXISTS) ili pristup atributima zbirke na neinicijaliziranim zbirkama |
CURSOR_ALREADY_OPEN | ORA-06511 | Pokušavam otvoriti a pokazivač koji je već otvoren |
DUP_VAL_ON_INDEX | ORA-00001 | Pohranjivanje duplicirane vrijednosti u stupac baze podataka koji je ograničen jedinstvenim indeksom |
INVALID_CURSOR | ORA-01001 | Nedopuštene radnje kursora poput zatvaranja neotvorenog kursora |
POGREŠAN BROJ | ORA-01722 | Pretvorba znaka u broj nije uspjela zbog nevažećeg znaka broja |
NISU PRONAĐENI PODACI | ORA-01403 | Kada naredba 'SELECT' koja sadrži klauzulu INTO ne dohvaća nijedan redak. |
ROW_MISMATCH | ORA-06504 | Kada tip podataka varijable kursora nije kompatibilan sa stvarnim tipom povrata kursora |
SUBSCRIPT_BEYOND_COUNT | ORA-06533 | Upućivanje zbirke prema broju indeksa koji je veći od veličine zbirke |
SUBSCRIPT_OUTSIDE_LIMIT | ORA-06532 | Upućivanje na zbirku prema broju indeksa koji je izvan zakonskog raspona (npr.: -1) |
TOO_MANY_ROWS | ORA-01422 | Kada naredba 'SELECT' s klauzulom INTO vrati više od jednog retka |
VALUE_ERROR | ORA-06502 | Aritmetička pogreška ili pogreška ograničenja veličine (npr.: dodjeljivanje vrijednosti varijabli koja je veća od veličine varijable) |
NULA_DIVIDE | ORA-01476 | Dijeljenje broja s '0' |
Korisnički definirana iznimka
In Oracle, osim gore definiranih iznimaka, 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 gdje god je paket dostupan.
Sintaksa: Na razini potprograma
DECLARE <exception_name> EXCEPTION; BEGIN <Execution block> EXCEPTION WHEN <exception_name> THEN <Handler> END;
- U gornjoj sintaksi, varijabla 'exception_name' definirana je kao tip 'EXCEPTION'.
- Ovo se može koristiti na sličan način kao unaprijed definirana iznimka.
Sintaksa:Na razini specifikacije paketa
CREATE PACKAGE <package_name> IS <exception_name> EXCEPTION; . . END <package_name>;
- U gornjoj sintaksi, varijabla 'exception_name' definirana je kao tip 'EXCEPTION' u specifikaciji paketa .
- Ovo se može koristiti u bazi podataka gdje god se može pozvati paket 'package_name'.
PL/SQL podizanje iznimke
Sve unaprijed definirane iznimke se implicitno pokreću kad god se pojavi pogreška. Ali korisnički definirane iznimke moraju biti eksplicitno podignute. To se može postići pomoću ključne riječi 'RAISE'. Ovo se može koristiti na bilo koji od dolje navedenih načina.
Ako se 'RAISE' koristi zasebno u programu, tada će već podignutu iznimku prenijeti na roditeljski blok. Samo u bloku izuzetaka može se koristiti kao što je prikazano u nastavku.
CREATE [ PROCEDURE | FUNCTION ] AS BEGIN <Execution block> EXCEPTION WHEN <exception_name> THEN <Handler> 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 "exception_name", iznimka se obrađuje i dovršit će se normalno
- Ali ključna riječ 'RAISE' u dijelu koji se bavi rukovanjem iznimkama prenijet će ovu posebnu iznimku na nadređeni program.
Bilješka: Tijekom podizanja iznimke u nadređeni blok, iznimka koja se podiže također bi trebala biti vidljiva u nadređenom bloku, inače će Oracle izbaciti pogrešku.
- Možemo upotrijebiti ključnu riječ 'RAISE' iza koje slijedi naziv iznimke za podizanje te određene korisnički definirane/predefinirane iznimke. Ovo se može koristiti iu izvršnom dijelu iu dijelu za rukovanje iznimkama za podizanje iznimke.
CREATE [ PROCEDURE | FUNCTION ] AS BEGIN <Execution block> RAISE <exception_name> EXCEPTION WHEN <exception_name> THEN <Handler> END;
Objašnjenje sintakse:
- U gornjoj sintaksi, ključna riječ RAISE koristi se u izvršnom dijelu nakon čega slijedi iznimka "exception_name".
- Ovo će pokrenuti ovu posebnu iznimku u vrijeme izvršenja, a to treba dodatno obraditi ili podići.
Primjer 1: U ovom primjeru ćemo vidjeti
- Kako proglasiti iznimku
- Kako podići deklariranu iznimku i
- Kako ga propagirati u glavni blok
DECLARE Sample_exception EXCEPTION; PROCEDURE nested_block IS BEGIN Dbms_output.put_line(‘Inside nested block’); Dbms_output.put_line(‘Raising sample_exception from nested block’); RAISE sample_exception; EXCEPTION WHEN sample_exception THEN Dbms_output.put_line (‘Exception captured in nested block. Raising to main block’); RAISE, END; BEGIN Dbms_output.put_line(‘Inside main block’); Dbms_output.put_line(‘Calling nested block’); Nested_block; EXCEPTION WHEN sample_exception THEN Dbms_output.put_line (‘Exception captured in main block'); END: /
Objašnjenje koda:
- Kodna linija 2: Deklaracija varijable 'sample_exception' kao vrste IZUZETKA.
- Kodna linija 3: Procedura deklariranja nested_block.
- Kodna linija 6: Ispis izjave “Unutar ugniježđenog bloka”.
- Redak koda 7: Ispisivanje izjave "Podizanje sample_exception iz ugniježđenog bloka."
- Redak koda 8: Podizanje iznimke pomoću 'RAISE sample_exception'.
- Redak koda 10: Rukovatelj iznimkom za iznimku sample_exception u ugniježđenom bloku.
- Redak koda 11: Ispisivanje izjave 'Iznimka uhvaćena u ugniježđenom bloku. Podizanje na glavni blok'.
- Redak koda 12: Podizanje iznimke na glavni blok (širenje na glavni blok).
- Redak koda 15: Ispisivanje izjave “Unutar glavnog bloka”.
- Redak koda 16: Ispis naredbe “Pozivanje ugniježđenog bloka”.
- Redak koda 17: Pozivanje procedure nested_block.
- Redak koda 18: izuzetak
- Redak koda 19: Rukovatelj iznimkama za sample_exception u glavnom bloku.
- Redak koda 20: Ispisivanje izjave "Iznimka snimljena u glavnom bloku."
Važne točke koje treba uzeti u obzir u Izuzeću
- U funkciji, iznimka bi uvijek trebala vratiti vrijednost ili dodatno podići iznimku. drugo Oracle izbacit će pogrešku 'Funkcija vraćena bez vrijednosti' tijekom vremena izvođenja.
- Izjave o kontroli transakcije mogu se dati u bloku za rukovanje iznimkama.
- SQLERRM i SQLCODE su ugrađene funkcije koje će dati poruku o iznimci i kod.
- Ako se iznimka ne obradi, tada će prema zadanim postavkama sve aktivne transakcije u toj sesiji biti vraćene.
- 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 '-'.
Rezime
Nakon ovog poglavlja. trebali biste moći raditi za sljedeće aspekte Pl SQL iznimke
- Rukovanje iznimkama
- Definirajte iznimku
- Podignite izuzetak
- Propagacija iznimke