Rukovanje iznimkama Oracle PL / SQL: Primjeri za podizanje korisnički definirane iznimke

Sadržaj:

Anonim

Što je rukovanje iznimkama u PL / SQL-u?

Iznimka se događa kada PL / SQL mehanizam naiđe na naredbu koju ne može izvršiti zbog pogreške koja se dogodi u vrijeme izvođenja. Te se pogreške neće zabilježiti u vrijeme sastavljanja i stoga ih je bilo potrebno riješiti samo u vrijeme izvođenja.

Na primjer, ako PL / SQL mehanizam primi uputu za dijeljenje bilo kojeg broja s '0', tada će ga PL / SQL stroj izuzeti. Izuzetak pokreće PL / SQL mehanizam 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 odvojeno. Taj se postupak naziva rukovanjem iznimkama, u kojem programer obrađuje iznimku koja se može dogoditi u vrijeme izvođenja.

U ovom uputstvu naučit ćete sljedeće teme-

  • Sintaksa rukovanja iznimkama
  • Vrste izuzetaka
  • Unaprijed definirane iznimke
  • Korisnički definirana iznimka
  • Iznimka za podizanje PL / SQL-a
  • Važne napomene koje treba napomenuti u iznimci

Sintaksa rukovanja iznimkama

Iznimke se obrađuju na bloku, na razini, tj. Kada se dogodi bilo koja iznimka u bilo kojem bloku, tada će kontrola izaći iz izvršnog dijela tog bloka. Iznimka će se tada obrađivati ​​u dijelu za rukovanje iznimkama tog bloka. Nakon obrade iznimke, nije moguće ponovno poslati kontrolu natrag u odjeljak izvršenja tog bloka.

Sintaksa u nastavku objašnjava kako uhvatiti i riješiti iznimku.

BEGIN… EXCEPTIONWHEN THENWHEN OTHERSTHENEND;

Objašnjenje sintakse:

  • U gornjoj sintaksi, blok za rukovanje iznimkama sadrži niz uvjeta WHEN za obradu iznimke.
  • Svaki WHEN uvjet slijedi ime iznimke za koje se očekuje da će se povećati u vrijeme izvođenja.
  • Kad se bilo koja iznimka pokrene tijekom izvođenja, tada će PL / SQL mehanizam potražiti u dijelu koji obrađuje iznimke za tu određenu iznimku. Započet će od prve klauzule "KADA" i uzastopno će pretraživati.
  • Ako je pronašao rukovanje iznimkom za iznimku koja je pokrenuta, tada će izvršiti taj određeni dio koda za rukovanje.
  • Ako nije navedena nijedna klauzula 'WHEN' za iznimku koja je pokrenuta, tada će PL / SQL mehanizam izvršiti dio 'WHEN OTHERS' (ako je prisutan). To je uobičajeno za sve iznimke.
  • Nakon izvršavanja iznimke, kontrola dijelova će izaći iz trenutnog bloka.
  • Samo jedan dio iznimke može se izvršiti za blok u vrijeme izvođenja. Nakon izvršenja, kontroler će preskočiti preostali dio koji obrađuje iznimke i izaći će iz trenutnog bloka.

Napomena: KADA OSTALI uvijek trebaju biti na posljednjem mjestu niza. Dio za rukovanje iznimkama prisutan nakon WHEN OTHERS nikada se neće izvršiti jer će kontrola izaći iz bloka nakon izvršavanja WHEN OTHERS.

Vrste izuzetaka

Postoje dvije vrste iznimki u Pl / SQL-u.

  1. Unaprijed definirane iznimke
  2. Korisnički definirana iznimka

Unaprijed definirane iznimke

Oracle je unaprijed definirao neku uobičajenu iznimku. Te iznimke imaju jedinstveno ime iznimke i broj pogreške. Te su iznimke već definirane u paketu 'STANDARD' u programu Oracle. U kodu možemo izravno koristiti ta unaprijed definirana imena iznimke za njihovo rukovanje.

Ispod je nekoliko unaprijed definiranih iznimaka

Iznimka Kod pogreške Razlog iznimke
ACCESS_INTO_NULL ORA-06530 Dodijelite vrijednost atributima neinicijaliziranih objekata
CASE_NOT_FOUND ORA-06592 Niti jedna klauzula 'WHEN' u CASE izjavi nije zadovoljena i nije navedena nijedna klauzula 'ELSE'
COLLECTION_IS_NULL ORA-06531 Upotreba metoda sakupljanja (osim POSTOJI) ili pristupanje atributima zbirke na neinicijaliziranim zbirkama
CURSOR_ALREADY_OPEN ORA-06511 Pokušaj otvaranja kursora koji je već otvoren
DUP_VAL_ON_INDEX ORA-00001 Pohranjivanje dvostruke vrijednosti u stupac baze podataka koji je ograničen jedinstvenim indeksom
INVALIDNI_KURSOR ORA-01001 Ilegalne operacije kursora poput zatvaranja neotvorenog kursora
POGREŠAN BROJ ORA-01722 Pretvorba znaka u broj nije uspjela zbog nevaljanog znaka broja
NE_PODATAK_NAĐEN ORA-01403 Kada izraz "SELECT" koji sadrži klauzulu INTO ne dohvaća redove.
RED_NESAGLAŠENOST ORA-06504 Kada je tip podataka varijable kursora nekompatibilan sa stvarnim tipom povratka kursora
SUBSCRIPT_BEYOND_COUNT ORA-06533 Navođenje zbirke indeksnim brojem koji je veći od veličine zbirke
PRETPLATI SE_OUTSIDE_LIMIT ORA-06532 Navođenje zbirke indeksnim brojem koji je izvan zakonskog raspona (npr .: -1)
TOO_MANY_ROWS ORA-01422 Kada izraz 'SELECT' s klauzulom INTO vrati više od jednog retka
VALUE_ERROR ORA-06502 Aritmetička pogreška ili ograničenje veličine (npr .: dodjeljivanje vrijednosti varijabli koja je veća od veličine varijable)
NULA_DIJELI ORA-01476 Dijeljenje broja s '0'

Korisnički definirana iznimka

U Oracleu, osim prethodno unaprijed definiranih iznimki, 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 svugdje gdje je paketu dostupan. <

Sintaksa: na razini potprograma

DECLARE EXCEPTION;BEGINEXCEPTIONWHEN  THENEND;
  • U gornjoj sintaksi, varijabla 'iznimka_ime' definirana je kao tip 'IZUZETKA'.
  • To se može koristiti na sličan način kao unaprijed definirana iznimka.

Sintaksa: na razini specifikacija paketa

CREATE PACKAGE 
IS EXCEPTION;… END 
;
  • U gornjoj sintaksi, varijabla 'iznimka_ime' definirana je kao vrsta 'IZUZETAK' u specifikaciji paketa .
  • To se može koristiti u bazi podataka gdje god se može nazvati paket 'ime_paketa'.

Iznimka za podizanje PL / SQL-a

Sve unaprijed definirane iznimke podrazumijevaju se implicitno kad god se pogreška dogodi. No, iznimke koje definira korisnik treba izričito podići. To se može postići korištenjem ključne riječi "PODIZI". To se može koristiti na bilo koji od dolje spomenutih načina.

Ako se 'RAISE' koristi zasebno u programu, tada će proširiti već podignutu iznimku na nadređeni blok. Samo u iznimnom bloku može se koristiti kako je prikazano u nastavku.

CREATE [ PROCEDURE | FUNCTION ]ASBEGINEXCEPTIONWHEN  THENRAISE;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 "iznimka_ime", s iznimkom se rukuje i dovršit će se normalno
  • No, ključna riječ 'RAISE' u dijelu za rukovanje iznimkama proširit će ovu posebnu iznimku na nadređeni program.

Napomena: Dok podizanje iznimke na nadređeni blok, iznimka koja se podiže također treba biti vidljiva na nadređenom bloku, inače će Oracle izbaciti pogrešku.

  • Možemo upotrijebiti ključnu riječ 'RAISE' iza koje slijedi ime iznimke da bismo pokrenuli tu određenu korisničku / unaprijed definiranu iznimku. To se može koristiti i u izvršnom dijelu i u dijelu za rukovanje iznimkama za podizanje iznimke.
CREATE [ PROCEDURE | FUNCTION ]ASBEGINRAISE EXCEPTIONWHEN  THENEND;

Objašnjenje sintakse:

  • U gornjoj sintaksi, ključna riječ RAISE koristi se u izvršnom dijelu nakon čega slijedi iznimka "iznimka_ime".
  • To će pokrenuti ovu posebnu iznimku u vrijeme izvršenja, a to treba riješiti ili povećati dalje.

Primjer 1 : U ovom primjeru ćemo vidjeti

  • Kako prijaviti iznimku
  • Kako podići deklariranu iznimku i
  • Kako ga proširiti u glavni blok
DECLARESample_exception EXCEPTION;PROCEDURE nested_blockISBEGINDbms_output.put_line(‘Inside nested block’);Dbms_output.put_line(‘Raising sample_exception from nested block’);RAISE sample_exception;EXCEPTIONWHEN sample_exception THENDbms_output.put_line (‘Exception captured in nested block. Raising to main block’);RAISE,END;BEGINDbms_output.put_line(‘Inside main block’);Dbms_output.put_line(‘Calling nested block’);Nested_block;EXCEPTIONWHEN sample_exception THEN Dbms_output.put_line (‘Exception captured in main block');END:/

Objašnjenje koda:

  • Redak koda 2 : Proglašavanje varijable 'sample_exception' tipom EXCEPTION.
  • Redak koda 3 : Postupak deklariranja nested_block.
  • 6. redak koda : Ispis izjave "Unutar ugniježđenog bloka".
  • Redak koda 7: Ispis izjave "Podizanje sample_exception iz ugniježđenog bloka."
  • Redak koda 8: Povećavanje iznimke pomoću 'RAISE sample_exception'.
  • Redak koda 10: Obrađivač iznimki za iznimku sample_exception u ugniježđenom bloku.
  • Redak koda 11: Ispis izraza 'Iznimka zabilježena u ugniježđeni blok. Podizanje u glavni blok '.
  • Redak koda 12: Podizanje iznimke u glavni blok (širenje u glavni blok).
  • Redak koda 15: Ispis izjave "Unutar glavnog bloka".
  • Redak koda 16: Ispis izjave "Pozivanje ugniježđenog bloka".
  • Redak koda 17: Pozivanje postupka nested_block.
  • Redak koda 19: Obrađivač izuzetaka za sample_exception u glavnom bloku.
  • Redak koda 20: Ispis izjave "Iznimka zabilježena u glavnom bloku."

Važne napomene koje treba napomenuti u iznimci

  • U funkciji, iznimka bi uvijek trebala ili vratiti vrijednost ili dodatno povisiti iznimku. inače će Oracle u vrijeme izvođenja baciti pogrešku "Funkcija vraćena bez vrijednosti".
  • Izvodi o kontroli transakcija mogu se dati u bloku za rukovanje iznimkama.
  • SQLERRM i SQLCODE su ugrađene funkcije koje će dati poruku i kôd iznimke.
  • Ako se ne obradi iznimka, tada će se prema zadanim postavkama sve aktivne transakcije u toj sesiji vratiti.
  • 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 '-'.

Sažetak

Nakon ovog poglavlja. trebali biste biti u mogućnosti raditi na sljedećim aspektima Pl SQL iznimaka

  • Rukovanje iznimkama
  • Definirajte iznimku
  • Povećajte iznimku
  • Razmnožavanje iznimke