Spracovanie výnimiek Oracle PL / SQL: Príklady zvýšenia používateľom definovanej výnimky

Obsah:

Anonim

Čo je spracovanie výnimiek v PL / SQL?

Výnimka nastane, keď engine PL / SQL narazí na inštrukciu, ktorú nemôže vykonať kvôli chybe, ktorá sa vyskytne za behu. Tieto chyby nebudú zachytené v čase kompilácie, a preto je potrebné ich spracovávať iba za behu programu.

Napríklad, ak modul PL / SQL dostane pokyn na vydelenie ľubovoľného čísla číslom „0“, potom ho modul PL / SQL vyhodí ako výnimku. Výnimka je vyvolaná iba za behu strojom PL / SQL.

Výnimky zastavia ďalšie vykonávanie programu, takže aby sa zabránilo takémuto stavu, je potrebné ich zachytiť a zaobchádzať s nimi osobitne. Tento proces sa nazýva spracovanie výnimiek, pri ktorom programátor spracuje výnimku, ktorá sa môže vyskytnúť za behu programu.

V tomto tutoriáli sa dozviete nasledujúce témy -

  • Syntax spracovania výnimiek
  • Druhy výnimiek
  • Preddefinované výnimky
  • Užívateľom definovaná výnimka
  • Výnimka pre zvýšenie PL / SQL
  • Dôležité poznámky, ktoré je potrebné poznamenať vo Výnimke

Syntax spracovania výnimiek

Výnimky sa spracúvajú na úrovni bloku, tj. Ak sa v niektorom bloku vyskytne nejaká výnimka, potom ovládací prvok vyjde z časti vykonania tohto bloku. Výnimka sa potom spracuje v časti spracovania výnimiek tohto bloku. Po spracovaní výnimky nie je možné znova odoslať kontrolu späť do sekcie vykonania daného bloku.

Nasledujúca syntax vysvetľuje, ako zachytiť a spracovať výnimku.

BEGIN… EXCEPTIONWHEN THENWHEN OTHERSTHENEND;

Vysvetlenie syntaxe:

  • Vo vyššie uvedenej syntaxi obsahuje blok spracovania výnimiek sériu podmienok WHEN na spracovanie výnimky.
  • Za každou KEDY podmienkou nasleduje názov výnimky, ktorého výskyt sa očakáva za behu programu.
  • Keď je za behu vyvolaná akákoľvek výnimka, potom bude modul PL / SQL hľadať v časti na spracovanie výnimiek konkrétnu výnimku. Začína sa to od prvej klauzuly „WHEN“ a postupne sa bude hľadať.
  • Ak zistí spracovanie výnimky pre výnimku, ktorá bola vyvolaná, vykoná túto konkrétnu časť kódu spracovania.
  • Ak žiadna z klauzúl „WHEN“ nie je k dispozícii pre výnimku, ktorá bola vyvolaná, potom PL / SQL engine vykoná časť „WHEN OTHERS“ (ak je prítomná). To je spoločné pre všetky výnimky.
  • Po vykonaní výnimky sa riadenie časti dostane mimo aktuálny blok.
  • Za spustenia je možné pre blok spustiť iba jednu časť výnimky. Po jeho vykonaní radič preskočí zostávajúcu časť spracovania výnimiek a vyjde z aktuálneho bloku.

Poznámka: KEĎ ostatní by mali byť vždy na poslednej pozícii sekvencie. Časť na spracovanie výnimiek, ktorá sa vyskytne po WHEN OTHERS, sa nikdy nespustí, pretože ovládací prvok opustí blok po vykonaní WHEN OTHERS.

Druhy výnimiek

V Pl / SQL existujú dva typy výnimiek.

  1. Preddefinované výnimky
  2. Užívateľom definovaná výnimka

Preddefinované výnimky

Spoločnosť Oracle preddefinovala niekoľko bežných výnimiek. Tieto výnimky majú jedinečný názov výnimky a číslo chyby. Tieto výnimky sú už definované v balíku „ŠTANDARD“ v systéme Oracle. V kóde môžeme tieto preddefinované názvy výnimiek použiť priamo na ich spracovanie.

Ďalej uvádzame niekoľko preddefinovaných výnimiek

Výnimka Kód chyby Dôvod výnimky
ACCESS_INTO_NULL ORA-06530 Priraďte hodnotu atribútom neinicializovaných objektov
CASE_NOT_FOUND ORA-06592 Žiadna z klauzúl „WHEN“ vo výkaze CASE nie je splnená a nie je zadaná žiadna klauzula „ELSE“
COLLECTION_IS_NULL ORA-06531 Používanie metód zbierky (okrem EXISTUJE) alebo prístup k atribútom zbierky v neinicializovaných zbierkach
CURSOR_ALREADY_OPEN ORA-06511 Pokúšam sa otvoriť kurzor, ktorý je už otvorený
DUP_VAL_ON_INDEX ORA-00001 Uloženie duplicitnej hodnoty do stĺpca databázy, ktorý je obmedzený jedinečným indexom
INVALID_CURSOR ORA-01001 Neplatné operácie s kurzorom, ako napríklad zatváranie neotvoreného kurzora
ZLÉ ČÍSLO ORA-01722 Konverzia znaku na číslo zlyhala z dôvodu neplatného číselného znaku
NEBOLI NÁJDENÉ ŽIADNE DÁTA ORA-01403 Keď príkaz 'SELECT', ktorý obsahuje klauzulu INTO, nenačíta žiadne riadky.
ROW_MISMATCH ORA-06504 Keď je premenný údajový typ kurzora nekompatibilný so skutočným návratovým typom kurzora
SUBSCRIPT_BEYOND_COUNT ORA-06533 Sprostredkovanie zbierky indexovým číslom, ktoré je väčšie ako veľkosť zbierky
SUBSCRIPT_OUTSIDE_LIMIT ORA-06532 Sprostredkovanie zbierky podľa indexového čísla, ktoré je mimo zákonného rozsahu (napr. -1)
TOO_MANY_ROWS ORA-01422 Keď výraz 'SELECT' s klauzulou INTO vráti viac ako jeden riadok
VALUE_ERROR ORA-06502 Aritmetická chyba alebo chyba obmedzenia veľkosti (napr. Priradenie hodnoty premennej, ktorá je väčšia ako premenná veľkosť)
ZERO_DIVIDE ORA-01476 Delenie čísla číslom „0“

Užívateľom definovaná výnimka

V systéme Oracle môže programátor, okrem vyššie preddefinovaných výnimiek, vytvoriť svoju vlastnú výnimku a spracovať ich. Môžu byť vytvorené na úrovni podprogramu v deklaračnej časti. Tieto výnimky sú viditeľné iba v danom podprograme. Výnimka, ktorá je definovaná v špecifikácii balíka, je verejná výnimka a je viditeľná všade, kde je balík prístupný. <

Syntax: Na úrovni podprogramu

DECLARE EXCEPTION;BEGINEXCEPTIONWHEN  THENEND;
  • Vo vyššie uvedenej syntaxi je premenná „exception_name“ definovaná ako typ „EXCEPTION“.
  • To sa dá použiť podobne ako preddefinovaná výnimka.

Syntax: Na úrovni špecifikácie balíka

CREATE PACKAGE 
IS EXCEPTION;… END 
;
  • Vo vyššie uvedenej syntaxi je premenná „exception_name“ v špecifikácii balíka definovaná ako typ „EXCEPTION“.
  • Toto je možné použiť v databáze kdekoľvek, kde je možné zavolať balík „názov_balíka“.

Výnimka pre zvýšenie PL / SQL

Všetky preddefinované výnimky sa vyvolajú implicitne vždy, keď sa vyskytne chyba. Je však potrebné výslovne upozorniť na výnimky definované používateľom. To sa dá dosiahnuť pomocou kľúčového slova „RAISE“. Toto je možné použiť ktorýmkoľvek z nižšie uvedených spôsobov.

Ak sa v programe použije výraz „RAISE“ osobitne, rozšíri sa už vyvolaná výnimka do nadradeného bloku. Iba vo výnimočnom bloku je možné použiť, ako je uvedené nižšie.

CREATE [ PROCEDURE | FUNCTION ]ASBEGINEXCEPTIONWHEN  THENRAISE;END;

Vysvetlenie syntaxe:

  • Vo vyššie uvedenej syntaxi sa v bloku spracovania výnimiek používa kľúčové slovo RAISE.
  • Kedykoľvek program narazí na výnimku „exception_name“, výnimka sa spracuje a bude dokončená normálne
  • Ale kľúčové slovo 'RAISE' v časti zaoberajúcej sa výnimkami rozšíri túto konkrétnu výnimku na nadradený program.

Poznámka: Pri zvyšovaní výnimky na nadradený blok by výnimka, ktorá sa zvyšuje, mala byť viditeľná aj v nadradenom bloku, inak Oracle spôsobí chybu.

  • Na zvýšenie konkrétnej používateľom definovanej / preddefinovanej výnimky môžeme použiť kľúčové slovo „RAISE“, za ktorým nasleduje názov výnimky. Toto je možné použiť v exekučnej časti aj v časti vybavovania výnimiek na vyvolanie výnimky.
CREATE [ PROCEDURE | FUNCTION ]ASBEGINRAISE EXCEPTIONWHEN  THENEND;

Vysvetlenie syntaxe:

  • Vo vyššie uvedenej syntaxi sa v exekučnej časti používa kľúčové slovo RAISE, za ktorým nasleduje výnimka „exception_name“.
  • Toto zvýši túto konkrétnu výnimku v čase vykonania a je potrebné s ňou ďalej rokovať alebo o nej hovoriť.

Príklad 1 : V tomto príklade uvidíme

  • Ako vyhlásiť výnimku
  • Ako zvýšiť uvedenú výnimku a
  • Ako to rozšíriť do hlavného bloku
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:/

Vysvetlenie kódu:

  • Riadok kódu 2 : Deklarovanie premennej 'sample_exception' ako typu EXCEPTION.
  • Riadok kódu 3 : Deklaračný postup nested_block.
  • Riadok kódu 6 : Tlač vyhlásenia „Vo vnútri vnoreného bloku“.
  • Riadok kódu 7: Tlač vyhlásenia „Zvyšovanie sample_exception z vnoreného bloku.“
  • Riadok kódu 8: Zvyšovanie výnimky pomocou 'RAISE sample_exception'.
  • Riadok kódu 10: Obslužný program výnimky pre výnimku sample_exception vo vnorenom bloku.
  • Riadok kódu 11: Tlač vyhlásenia „Výnimka zachytená vo vnorenom bloku. Zvyšovanie do hlavného bloku “.
  • Riadok kódu 12: Zvýšenie výnimky na hlavný blok (šírenie do hlavného bloku).
  • Riadok kódu 15: Tlač vyhlásenia „Vo vnútri hlavného bloku“.
  • Riadok kódu 16: Tlač výpisu „Volanie vnoreného bloku“.
  • Riadok kódu 17: Volanie procedúry nested_block.
  • Riadok kódu 19: Obslužný program výnimiek pre sample_exception v hlavnom bloku.
  • Riadok kódu 20: Tlač vyhlásenia „Výnimka zachytená v hlavnom bloku.“

Dôležité poznámky, ktoré je potrebné poznamenať vo Výnimke

  • Vo funkcii by výnimka mala vždy buď vracať hodnotu, alebo ju ešte zvyšovať. inak Oracle za behu vyhodí chybu „Funkcia vrátená bez hodnoty“.
  • Príkazy na kontrolu transakcie je možné zadať v bloku spracovania výnimiek.
  • SQLERRM a SQLCODE sú vstavané funkcie, ktoré poskytnú správu a kód výnimky.
  • Ak sa výnimka nespracuje, predvolene sa vrátia všetky aktívne transakcie v danej relácii.
  • RAISE_APPLICATION_ERROR (- , ) je možné použiť namiesto RAISE na zvýšenie chyby pomocou užívateľského kódu a správy. Kód chyby by mal byť väčší ako 20 000 a mal by mať predponu „-“.

Zhrnutie

Po tejto kapitole. mali by ste byť schopní pracovať pre nasledujúce aspekty výnimiek Pl SQL

  • Riešenie výnimiek
  • Definujte výnimku
  • Zvýšiť výnimku
  • Šírenie výnimiek