Č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 THEN WHEN OTHERSTHEN END;
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.
- Preddefinované výnimky
- 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
DECLAREEXCEPTION;BEGIN EXCEPTIONWHEN THEN END;
- 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 PACKAGEIS 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 THEN RAISE;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 THEN END;
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