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





