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.

Rukovanje iznimkama u PL/SQL

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.

  1. Unaprijed definirane iznimke
  2. 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.

PL/SQL podizanje iznimke

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.

PL/SQL 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

PL/SQL podizanje iznimke

PL/SQL podizanje iznimke

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

Saลพmite ovu objavu uz: