Ravnanje z izjemami Oracle PL / SQL: Primeri za dvig uporabniško določene izjeme

Kazalo:

Anonim

Kaj je obravnava izjem v PL / SQL?

Izjema se zgodi, ko mehanizem PL / SQL naleti na navodilo, ki ga ne more izvršiti zaradi napake, ki se pojavi med izvajanjem. Te napake v času prevajanja ne bodo zajete, zato jih je bilo treba obravnavati samo v času izvajanja.

Če na primer mehanizem PL / SQL prejme navodilo, da poljubno število deli z '0', ga bo mehanizem PL / SQL vrgel kot izjemo. Izjemo sproži samo mehanizem PL / SQL med izvajanjem.

Izjeme bodo ustavile nadaljnje izvajanje programa, zato jih je treba preprečiti in jih ločiti. Ta postopek se imenuje obravnava izjem, v katerem programer obravnava izjemo, ki se lahko pojavi med izvajanjem.

V tej vadnici boste izvedeli naslednje teme -

  • Sintaksa ravnanja z izjemami
  • Vrste izjem
  • Vnaprej določene izjeme
  • Uporabniško določena izjema
  • Izjema za dvig PL / SQL
  • Pomembne točke v opombi

Sintaksa ravnanja z izjemami

Izjeme se obravnavajo na nivoju bloka, tj. Ko pride do kakršne koli izjeme v katerem koli bloku, bo nadzor prišel iz izvršitvenega dela tega bloka. Izjema bo nato obdelana v delu, ki obravnava izjeme v tem bloku. Po obdelavi izjeme ni mogoče znova poslati nadzora nazaj v odsek za izvajanje tega bloka.

Spodnja sintaksa pojasnjuje, kako ujeti in obvladati izjemo.

BEGIN… EXCEPTIONWHEN THENWHEN OTHERSTHENEND;

Pojasnilo sintakse:

  • V zgornji sintaksi blok za ravnanje z izjemami vsebuje vrsto pogojev WHEN za obdelavo izjeme.
  • Vsakemu pogoju WHEN sledi ime izjeme, ki naj bi se povišalo med izvajanjem.
  • Ko se katera koli izjema sproži med izvajanjem, bo mehanizem PL / SQL v delu za obravnavo izjem poiskal to posebno izjemo. Začelo se bo s prvo klavzulo "KDAJ" in zaporedno iskalo.
  • Če je našel obravnavo izjeme za izjemo, ki je bila postavljena, bo izvedel ta del kode za ravnanje.
  • Če za izjemo, ki je bila postavljena, ni nobenega od stavkov 'WHEN', bo PL / SQL motor izvedel del 'WHEN OTHERS' (če je prisoten). To je skupno za vse izjeme.
  • Po izvedbi izjeme bo nadzor nad deli izšel iz trenutnega bloka.
  • V času izvajanja je za blok mogoče izvesti samo en izjemen del. Po njegovem izvajanju bo krmilnik preskočil preostali del, ki obravnava izjeme, in bo izstopil iz trenutnega bloka.

Opomba: KDAJ DRUGI morajo biti vedno na zadnjem mestu zaporedja. Del, ki obravnava izjeme, prisoten po WHEN OTHERS, se ne bo nikoli izvedel, saj bo nadzor po izvedbi WHEN OTHERS zapustil blok.

Vrste izjem

V Pl / SQL obstajata dve vrsti izjem.

  1. Vnaprej določene izjeme
  2. Uporabniško določena izjema

Vnaprej določene izjeme

Oracle je vnaprej določil nekaj pogostih izjem. Te izjeme imajo edinstveno ime izjeme in številko napake. Te izjeme so že opredeljene v paketu 'STANDARD' v Oracle. V kodi lahko neposredno uporabimo ta vnaprej določena imena izjem.

Spodaj je nekaj vnaprej določenih izjem

Izjema Napačna koda Razlog za izjemo
ACCESS_INTO_NULL ORA-06530 Atributom neinicializiranih predmetov dodelite vrednost
CASE_NOT_FOUND ORA-06592 Noben od stavkov 'WHEN' v stavku CASE ni zadovoljen in noben člen 'ELSE' ni naveden
COLLECTION_IS_NULL ORA-06531 Uporaba metod zbiranja (razen EXISTS) ali dostop do atributov zbirke v neinicializiranih zbirkah
CURSOR_ALREADY_OPEN ORA-06511 Poskus odpreti že odprti kazalec
DUP_VAL_ON_INDEX ORA-00001 Shranjevanje podvojene vrednosti v stolpec baze podatkov, ki je omejen z edinstvenim indeksom
INVALID_CURSOR ORA-01001 Nezakonite operacije kurzorja, kot je zapiranje neodprtega kurzorja
INVALID_NUMBER ORA-01722 Pretvorba znaka v številko ni uspela zaradi neveljavnega številskega znaka
NO_DATA_FOUND ORA-01403 Ko stavek 'SELECT', ki vsebuje stavek INTO, ne pridobi vrstic.
ROW_MISMATCH ORA-06504 Kadar je podatkovni tip spremenljivke kurzorja nezdružljiv z dejanskim tipom vračanja kurzorja
SUBSCRIPT_BEYOND_COUNT ORA-06533 Sklicevanje na zbirko z indeksno številko, ki je večja od velikosti zbirke
NAROČITE SE NAROČI_OUTSIDE_LIMIT ORA-06532 Navajanje zbirke z indeksno številko, ki je zunaj dovoljenega obsega (npr .: -1)
TOO_MANY_ROWS ORA-01422 Ko stavek 'SELECT' s stavkom INTO vrne več kot eno vrstico
VALUE_ERROR ORA-06502 Napaka aritmetične omejitve ali velikosti (npr. Dodelitev vrednosti spremenljivki, ki je večja od velikosti spremenljivke)
ZERO_DIVIDE ORA-01476 Delitev števila z '0'

Uporabniško določena izjema

V programu Oracle, razen zgoraj vnaprej določenih izjem, lahko programer ustvari lastno izjemo in z njimi ravna. Ustvarijo se lahko na ravni podprograma v delu izjave. Te izjeme so vidne samo v tem podprogramu. Izjema, ki je definirana v specifikaciji paketa, je javna izjema in je vidna povsod, kjer je paket dostopen. <

Sintaksa: na ravni podprograma

DECLARE EXCEPTION;BEGINEXCEPTIONWHEN  THENEND;
  • V zgornji sintaksi je spremenljivka 'ime_izjeme' definirana kot tip 'IZJEMA'.
  • To lahko uporabimo na podoben način kot vnaprej določeno izjemo.

Sintaksa: na ravni specifikacije paketa

CREATE PACKAGE 
IS EXCEPTION;… END 
;
  • V zgornji sintaksi je spremenljivka "ime_izjeme" opredeljena kot "EXCEPTION" v specifikaciji paketa .
  • To se lahko uporablja v zbirki podatkov, kjer koli je mogoče poklicati paket 'ime_paketa'.

Izjema za dvig PL / SQL

Vse vnaprej določene izjeme se implicitno sprožijo vsakič, ko pride do napake. Toda uporabniško določene izjeme je treba izrecno navesti. To lahko dosežemo s ključno besedo 'RAISE'. To lahko uporabite na katerega koli od spodaj navedenih načinov.

Če se 'RAISE' v programu uporablja ločeno, bo razširjeno že razširjeno izjemo razširil na nadrejeni blok. Uporabite lahko le blok izjem, kot je prikazano spodaj.

CREATE [ PROCEDURE | FUNCTION ]ASBEGINEXCEPTIONWHEN  THENRAISE;END;

Pojasnilo sintakse:

  • V zgornji sintaksi je v bloku za obravnavo izjem uporabljena ključna beseda RAISE.
  • Kadar koli program naleti na izjemo "ime_izjeme", se z izjemo ravna in bo normalno dokončana
  • Toda ključna beseda 'RAISE' v delu za obdelavo izjem bo to posebno izjemo razširila v nadrejeni program.

Opomba: Med dvigovanjem izjeme v nadrejeni blok mora biti izjema, ki se dviguje, vidna tudi v nadrejenem bloku, sicer bo oracle vrnil napako.

  • Ključno besedo 'RAISE', ki ji sledi ime izjeme, lahko uporabimo za dvig te uporabniško določene / vnaprej določene izjeme. To je mogoče uporabiti tako v izvedbenem delu kot tudi v delu za obdelavo izjem, da se izjema sproži.
CREATE [ PROCEDURE | FUNCTION ]ASBEGINRAISE EXCEPTIONWHEN  THENEND;

Pojasnilo sintakse:

  • V zgornji sintaksi je v izvedbenem delu uporabljena ključna beseda RAISE, ki ji sledi izjema "ime_izjeme".
  • To bo povzročilo to posebno izjemo v času izvršbe, kar je treba obravnavati ali povečati še naprej.

Primer 1 : V tem primeru bomo videli

  • Kako prijaviti izjemo
  • Kako dvigniti prijavljeno izjemo in
  • Kako ga razširiti v 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:/

Razlaga kode:

  • Vrstica kode 2 : Razglasitev spremenljivke 'sample_exception' za tip EXCEPTION.
  • Vrstica kode 3 : prijava postopka ugnezdeni_blok.
  • 6. vrstica kode : Tiskanje stavka "Znotraj ugnezdenega bloka".
  • Vrstica kode 7: Tiskanje stavka "Dvig vzorec_izjeme iz ugnezdenega bloka."
  • Vrstica kode 8: dvig izjeme z uporabo 'RAISE sample_exception'.
  • Vrstica kode 10: Obdelovalec izjem za izjemo sample_exception v ugnezdenem bloku.
  • Vrstica kode 11: Tiskanje stavka 'Izjema, zajeta v ugnezdeni blok. Dvig v glavni blok '.
  • Vrstica kode 12: dvig izjeme v glavni blok (razmnoževanje v glavni blok).
  • Vrstica kode 15: Tiskanje stavka "Znotraj glavnega bloka".
  • Vrstica kode 16: Tiskanje stavka "Klicanje ugnezdenega bloka".
  • Kodijska vrstica 17: Klicanje postopka nested_block.
  • Vrstica kode 19: Obdelovalec izjem za vzorec_izjeme v glavnem bloku.
  • Vrstica kode 20: Tiskanje stavka "Izjema, zajeta v glavnem bloku."

Pomembne točke v opombi

  • V funkciji mora izjema vedno vrniti vrednost ali pa izjemo še povečati. sicer bo Oracle med izvajanjem vrgel napako »Funkcija vrnjena brez vrednosti«.
  • Izjave o nadzoru transakcij lahko podate v bloku za obdelavo izjem.
  • SQLERRM in SQLCODE sta vgrajeni funkciji, ki podata sporočilo in kodo o izjemi.
  • Če se izjema ne obdeluje, se privzeto vse aktivne transakcije v tej seji povrnejo nazaj.
  • RAISE_APPLICATION_ERROR (- , ) se lahko uporabi za dvig napake z uporabniško kodo in sporočilom. Koda napake mora biti večja od 20000 in mora imeti predpono '-'.

Povzetek

Po tem poglavju. morali bi biti sposobni delati za naslednje vidike izjem Pl SQL

  • Obravnavanje izjem
  • Določite izjemo
  • Dvignite izjemo
  • Razmnoževanje izjem