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