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.

  • Pogreške tijekom izvođenja: Iznimka nastaje kada PL/SQL mehanizam naiđe na instrukciju koju ne može izvršiti, kao što je dijeljenje broja s nulom.
  • 🧱 Struktura bloka: Iznimke se obrađuju u odjeljku EXCEPTION pomoću klauzula WHEN, pri čemu se WHEN OTHERS uvijek stavlja na kraj.
  • 📚 Unaprijed definirane iznimke: Oracle imenuje uobičajene pogreške poput NO_DATA_FOUND i ZERO_DIVIDE u STANDARD paketu, spremne za izravno hvatanje.
  • 🛠️ Korisnički definirane iznimke: Programeri deklariraju vlastite varijable EXCEPTION i eksplicitno ih podižu ključnom riječi RAISE.
  • ⬆️ Razmnožavanje: Neobrađena iznimka prenosi se na blok koji ga okružuje, a RAISE je ponovno signalizira roditeljskom programu.
  • 🤖 AI pomoć: Alati za AI kodiranje izrađuju blokove IZUZETAKA i označavaju neobrađene putanje pogrešaka tijekom pregleda.

Upravljanje iznimkama Oracle PL / SQL

Š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:

Struktura PL/SQL bloka s dijelom za izvršavanje i iznimke

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:

Širenje iznimke na roditeljski blok s golim RAISE-om

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:

Izazivanje određenog imenovanog izuzetka s RAISE nakon čega slijedi naziv izuzetka

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:

PL/SQL primjer deklariranja i podizanja korisnički definirane iznimke u ugniježđenom bloku

Sljedeća snimka zaslona prikazuje nastavak istog primjera, gdje glavni blok konačno bilježi propagiranu iznimku:

Izlaz koji prikazuje iznimku snimljenu prvo u ugniježđenom bloku, a zatim u glavnom bloku

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.

Pitanja i odgovori

PRAGMA EXCEPTION_INIT povezuje naziv iznimke koji je deklarirao korisnik sa specifičnim Oracle broj pogreške. Nakon povezivanja, možete uhvatiti tu ORA pogrešku po imenu u WHEN klauzuli umjesto korištenja WHEN OTHERS i provjere SQLCODE.

SQLCODE vraća numerički kod pogreške trenutnog izuzetka, dok SQLERRM vraća tekstualnu poruku. Oba se pozivaju unutar rukovatelja izuzetcima, najčešće bloka WHEN OTHERS, za zapisivanje ili prikaz što je pošlo po zlu.

Izbjegavajte WHEN OTHERS koji tiho guta svaku grešku. Bez zapisivanja SQLCODE i SQLERRM ili ponovnog podizanja s RAISE, skriva greške. Koristite ga samo za zapisivanje, čišćenje i zatim širenje iznimke.

RAISE_APPLICATION_ERROR prihvaća broj pogreške između -20000 i -20999 i poruku do 2048 bajtova. Zaustavlja izvršavanje i vraća prilagođenu pogrešku pozivajućoj aplikaciji, čineći da korisnički definirani uvjet izgleda kao izvorni. Oracle greška.

Ne u istom bloku — nakon što se kontrola pomakne u odjeljak EXCEPTION, taj blok završava. Za nastavak, rizičnu naredbu omotajte u unutarnji blok BEGIN…EXCEPTION…END; nakon što obradi grešku, vanjski blok nastavlja s izvršavanjem.

Pogreška je bilo koji problem u kodu tijekom izvođenja ili kompajliranja. Iznimka je mehanizam izvođenja PL/SQL-a koji predstavlja pogrešku u izvođenju, prenoseći kontrolu na odjeljak EXCEPTION kako bi program mogao odgovoriti umjesto da se naglo prekine.

Da. AI asistenti i preglednici koda za strojno učenje izrađuju blokove IZUZETAKA, predlažu koje unaprijed definirane iznimke treba uhvatiti i označavaju putove koda kojima nedostaju rukovatelji. Programer bi i dalje trebao potvrditi logiku i poruke o pogreškama prije implementacije.

GitHub kopilot automatski dovršava WHEN klauzule, pozive RAISE_APPLICATION_ERROR i pune EXCEPTION blokove iz kratkog komentara koji opisuje namjeru. Ubrzava kodiranje rutinskog rukovatelja, iako generirani kodovi pogrešaka i poruke zahtijevaju pregled radi točnosti.

Sažmite ovu objavu uz: