Upravljanje iznimkama Oracle PL/SQL (primjeri)
⚡ Pametni sažetak
Upravljanje iznimkama Oracle PL/SQL bilježi pogreške tijekom izvođenja koje zaustavljaju izvršavanje bloka, omogućujući mehanizmu da prenese kontrolu na odjeljak EXCEPTION gdje unaprijed definirani, korisnički definirani i OTHERS rukovatelji sigurno odgovaraju, izazivaju ili šire pogreške.

Što je rukovanje iznimkama u PL/SQL?
Iznimka se javlja kada PL/SQL programski sustav naiđe na instrukciju koju ne može izvršiti zbog pogreške koja se javlja tijekom izvođenja. Ove se pogreške ne otkrivaju tijekom kompajliranja i stoga se moraju obraditi samo tijekom izvođenja.
Na primjer, ako PL/SQL mehanizam primi instrukciju za dijeljenje broja s nulom, izbacuje grešku kao iznimku. Iznimku PL/SQL mehanizam izbacuje samo tijekom izvođenja.
Iznimka zaustavlja daljnje izvršavanje programa, pa kako bi se izbjeglo takvo stanje, pogrešku je potrebno uhvatiti i obraditi zasebno. Taj se proces naziva rukovanje iznimkama, u kojem programer obrađuje pogrešku koja se može pojaviti tijekom izvođenja.
Sintaksa rukovanja iznimkama
Iznimke se obrađuju na razini bloka. Nakon što se iznimka dogodi u bloku, kontrola napušta dio bloka koji se odnosi na izvršavanje, a iznimka se zatim obrađuje u dijelu bloka koji se odnosi na obradu iznimki. Nakon što se iznimka obradi, kontrola se ne može vratiti u dio bloka koji se odnosi na izvršavanje.
Donja ilustracija prikazuje kako se izvršni dio i dio za obradu iznimki nalaze unutar jednog PL/SQL bloka:
Sintaksa u nastavku objašnjava kako uhvatiti i obraditi iznimku.
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 obradu iznimki sadrži niz WHEN uvjeta za obradu iznimki.
- Nakon svakog WHEN uvjeta slijedi naziv iznimke za koju se očekuje da će se pojaviti tijekom izvođenja.
- Kada se tijekom izvođenja pojavi iznimka, PL/SQL mehanizam pretražuje dio za obradu iznimki za tu određenu iznimku, počevši od prve WHEN klauzule i krećući se sekvencijalno.
- Ako pronađe rukovatelj za iznimku koja je nastala, izvršava taj određeni kod rukovatelja.
- Ako se nijedna WHEN klauzula ne podudara s izazvanom iznimkom, PL/SQL mehanizam izvršava dio WHEN OTHERS, ako postoji. Ovaj rukovatelj je zajednički svim iznimkama.
- Nakon što se rukovatelj pokrene, kontrola napušta trenutni blok.
- Samo jedan rukovatelj iznimkama može se izvršiti za blok tijekom izvođenja. Nakon što se pokrene, mehanizam preskače preostale rukovatelje i napušta trenutni blok.
Bilješka: Naredbu WHEN OTHERS uvijek treba smjestiti na zadnju u nizu. Bilo koji rukovatelj napisan nakon WHEN OTHERS nikada se ne izvršava, jer kontrola izlazi iz bloka nakon što se WHEN OTHERS izvrši.
Vrste iznimki
Postoje dvije vrste iznimki u PL / SQL.
- Unaprijed definirane iznimke
- Korisnički definirane iznimke
Unaprijed definirane iznimke
Oracle ima unaprijed definirane neke uobičajene iznimke. Svaka unaprijed definirana iznimka ima jedinstveno ime i broj pogreške, a sve su deklarirane u STANDARD paketu u OracleU kodu možete izravno koristiti ove unaprijed definirane nazive iznimki za obradu odgovarajućih pogrešaka. Mnogi od njih se izravno preslikavaju na uobičajene SQL greške s kojima se susrećete svaki dan.
U nastavku je navedeno nekoliko unaprijed definiranih iznimaka:
| izuzetak | greška Code | Razlog iznimke |
|---|---|---|
| ACCESS_INTO_NULL | ORA-06530 | Dodjeljivanje vrijednosti atributima neinicijaliziranog objekta |
| SLUČAJ_NIJE_PRONAĐEN | ORA-06592 | Nijedna od WHEN klauzula u CASE naredbi nije zadovoljena i nije navedena ELSE klauzula. |
| COLLECTION_IS_NULL | ORA-06531 | Korištenje metoda kolekcije (osim EXISTS) ili pristup atributima kolekcije na neinicijaliziranoj kolekciji |
| 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 | Nedozvoljene operacije s kursorom, kao što je zatvaranje neotvorenog kursora |
| POGREŠAN BROJ | ORA-01722 | Pretvorba znaka u broj nije uspjela zbog nevažećeg numeričkog znaka |
| NISU PRONAĐENI PODACI | ORA-01403 | Naredba SELECT koja sadrži klauzulu INTO ne dohvaća retke |
| ROW_MISMATCH | ORA-06504 | Tip podataka varijable kursora nije kompatibilan sa stvarnim tipom povrata kursora |
| SUBSCRIPT_BEYOND_COUNT | ORA-06533 | Pozivanje na kolekciju pomoću indeksnog broja većeg od veličine kolekcije |
| SUBSCRIPT_OUTSIDE_LIMIT | ORA-06532 | Pozivanje na kolekciju pomoću indeksnog broja izvan dopuštenog raspona (na primjer, -1) |
| TOO_MANY_ROWS | ORA-01422 | Naredba SELECT s klauzulom INTO vraća više od jednog retka |
| VALUE_ERROR | ORA-06502 | Aritmetička pogreška ili pogreška ograničenja veličine (na primjer, dodjeljivanje vrijednosti veće od varijable size) |
| NULA_DIVIDE | ORA-01476 | Dijeljenje broja s nulom |
Korisnički definirana iznimka
Osim gore navedenih unaprijed definiranih iznimaka, programer može stvoriti prilagođene iznimke i njima upravljati. One se stvaraju na razini potprograma u deklaracijskom dijelu i vidljive su samo unutar tog potprograma. Iznimka definirana u specifikaciji paketa je javna iznimka i vidljiva je gdje god se paketu može pristupiti.
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 IZNIMKE.
- Zatim se može koristiti na isti način kao i 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 IZNIMKE u specifikaciji paketa .
- Može se koristiti u cijeloj 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 odgovarajuća greška. Međutim, korisnički definirane iznimke moraju se eksplicitno pokrenuti pomoću ključne riječi RAISE. RAISE se može koristiti na načine prikazane u nastavku.
Ako se RAISE koristi samostalno unutar rukovatelja, on širi već izazvanu iznimku na roditeljski blok. Može se koristiti samo unutar bloka iznimke, kao što je prikazano u nastavku.
Snimka zaslona u nastavku prikazuje RAISE korišten samostalno za ponovno podizanje iznimke u bloku koji ga okružuje:
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 se koristi unutar bloka za obradu iznimki.
- Kad god program naiđe na iznimku 'exception_name', iznimka se obrađuje i završava normalno.
- Ključna riječ RAISE u rukovatelju zatim propagira tu istu iznimku na roditeljski program.
Bilješka: Prilikom podizanja iznimke na roditeljski blok, iznimka koja se pokreće mora biti vidljiva i u roditeljskom bloku; u suprotnom Oracle izbacuje pogrešku.
Također možete koristiti ključnu riječ RAISE nakon koje slijedi naziv iznimke za pokretanje te određene korisnički definirane ili unaprijed definirane iznimke. Ovaj oblik može se koristiti i u dijelu izvršavanja i u dijelu rukovanja iznimkama.
Snimka zaslona u nastavku prikazuje RAISE nakon čega slijedi naziv iznimke za pokretanje određene 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 se koristi u dijelu izvršavanja, nakon čega slijedi iznimka 'exception_name'.
- To izaziva tu određenu iznimku tijekom izvođenja, a zatim je potrebno da se ona dalje obradi ili aktivira.
Primjer 1: U ovom primjeru vidjet ćemo:
- Kako proglasiti iznimku
- Kako pokrenuti deklarirani izuzetak
- Kako ga propagirati u glavni blok
Snimka zaslona u nastavku prikazuje cijeli blok koji deklarira sample_exception, podiže ga unutar ugniježđenog bloka i širi ga u glavni blok:
Sljedeća snimka zaslona prikazuje nastavak istog primjera, gdje glavni blok konačno bilježi propagiranu iznimku:
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; /
Code Objašnjenje:
- Code redak 2: Deklariranje varijable 'sample_exception' kao tipa EXCEPTION.
- Code redak 3: Deklariranje procedure nested_block.
- Code redak 6: Ispis naredbe „Unutar ugniježđenog bloka“.
- Code redak 7: Ispis naredbe „Podizanje sample_exceptiona iz ugniježđenog bloka“.
- Code redak 8: Podizanje iznimke pomoću 'RAISE sample_exception'.
- Code redak 10: Rukovatelj iznimkama za iznimku sample_exception u ugniježđenom bloku.
- Code redak 11: Ispis naredbe „Iznimka snimljena u ugniježđenom bloku. Podizanje na glavni blok“.
- Code redak 12: Podizanje iznimke na glavni blok (njeno širenje).
- Code redak 15: Ispis naredbe „Unutar glavnog bloka“.
- Code redak 16: Ispis naredbe “Pozivanje ugniježđenog bloka”.
- Code redak 17: Pozivanje procedure nested_block.
- Code redak 19: Rukovatelj iznimkama za sample_exception u glavnom bloku.
- Code redak 20: Ispis naredbe „Iznimka zabilježena u glavnom bloku“.
Važne točke koje treba uzeti u obzir u Izuzeću
- U funkciji, iznimka uvijek treba ili vratiti vrijednost ili dodatno izazvati iznimku; inače Oracle tijekom izvođenja izbacuje grešku 'Funkcija vraća bez vrijednosti'.
- Izjave o kontroli transakcija može se izdati unutar bloka za obradu iznimki.
- SQLERRM i SQLCODE su ugrađene funkcije koje vraćaju poruku o iznimci i kod iznimke.
- Ako se iznimka ne obradi, prema zadanim postavkama sve aktivne transakcije u toj sesiji se poništavaju.
- POGREŠKA_PRI_POVEĆANJU_APLIKACIJE (- , ) se može koristiti umjesto RAISE za generiranje pogreške s prilagođenim kodom i porukom. Kod pogreške mora biti između -20000 i -20999.





