Zpracování výjimek Oracle PL / SQL: Příklady zvýšení výjimky definované uživatelem

Obsah:

Anonim

Co je zpracování výjimek v PL / SQL?

Výjimka nastane, když modul PL / SQL narazí na instrukci, kterou nemůže provést kvůli chybě, ke které dojde za běhu. Tyto chyby nebudou zachyceny v době kompilace, a proto je bude nutné zpracovat pouze za běhu.

Například pokud modul PL / SQL obdrží instrukci k vydělení libovolného čísla číslicí „0“, pak jej modul PL / SQL vyhodí jako výjimku. Výjimka je vyvolána pouze za běhu strojem PL / SQL.

Výjimky zastaví program v dalším provádění, aby se takovým podmínkám zabránilo, je třeba je zachytit a zpracovat samostatně. Tento proces se nazývá zpracování výjimek, ve kterém programátor zpracovává výjimku, ke které může dojít za běhu.

V tomto výukovém programu se naučíte následující témata -

  • Syntaxe zpracování výjimek
  • Druhy výjimek
  • Předdefinované výjimky
  • Uživatelem definovaná výjimka
  • Výjimka pro zvýšení PL / SQL
  • Důležité body k poznámce ve Výjimce

Syntaxe zpracování výjimek

Výjimky jsou zpracovávány na úrovni bloku, tj. Jakmile se v některém bloku vyskytne nějaká výjimka, ovládací prvek vyjde z prováděcí části tohoto bloku. Výjimka bude poté zpracována v části zpracování výjimek daného bloku. Po zpracování výjimky není možné znovu odeslat ovládací prvek zpět do prováděcí části daného bloku.

Níže uvedená syntaxe vysvětluje, jak zachytit a zpracovat výjimku.

BEGIN… EXCEPTIONWHEN THENWHEN OTHERSTHENEND;

Vysvětlení syntaxe:

  • Ve výše uvedené syntaxi obsahuje blok zpracování výjimek řadu podmínek WHEN pro zpracování výjimky.
  • Za každou podmínkou WHEN následuje název výjimky, u které se očekává, že bude vyvolána v době běhu.
  • Když je za běhu vyvolána jakákoli výjimka, pak modul PL / SQL bude hledat v části zpracování výjimek pro tuto konkrétní výjimku. Začíná to od první klauzule „KDY“ a postupně bude hledat.
  • Pokud našel zpracování výjimek pro výjimku, která byla vznesena, provede tuto konkrétní část kódu zpracování.
  • Pokud žádná z klauzule 'WHEN' není k dispozici pro výjimku, která byla vznesena, pak PL / SQL stroj provede část 'WHEN OTHERS' (je-li k dispozici). To je společné pro všechny výjimky.
  • Po provedení výjimky přejde řízení součásti z aktuálního bloku.
  • Pro blok lze za běhu spustit pouze jednu část výjimky. Po jeho provedení ovladač přeskočí zbývající část zpracování výjimek a vyjde z aktuálního bloku.

Poznámka: KDYŽ DALŠÍ by měli být vždy na poslední pozici sekvence. Část pro zpracování výjimek přítomná po WHEN OTHERS se nikdy nezačne vykonávat, protože ovládací prvek opustí blok po provedení WHEN OTHERS.

Druhy výjimek

V Pl / SQL existují dva typy výjimek.

  1. Předdefinované výjimky
  2. Uživatelem definovaná výjimka

Předdefinované výjimky

Oracle předdefinoval některé běžné výjimky. Tyto výjimky mají jedinečný název výjimky a číslo chyby. Tyto výjimky jsou již definovány v balíčku „STANDARD“ v systému Oracle. V kódu můžeme tyto předdefinované názvy výjimek použít přímo k jejich zpracování.

Níže uvádíme několik předdefinovaných výjimek

Výjimka Chybový kód Důvod výjimky
ACCESS_INTO_NULL ORA-06530 Přiřaďte hodnotu atributům neinicializovaných objektů
CASE_NOT_FOUND ORA-06592 Žádná z klauzulí „WHEN“ v příkazu CASE není splněna a není zadána žádná klauzule „ELSE“
COLLECTION_IS_NULL ORA-06531 Použití metod kolekce (kromě EXISTUJE) nebo přístup k atributům kolekce u neinicializovaných kolekcí
CURSOR_ALREADY_OPEN ORA-06511 Pokoušíte se otevřít kurzor, který je již otevřen
DUP_VAL_ON_INDEX ORA-00001 Ukládání duplicitní hodnoty do sloupce databáze, který je omezen jedinečným indexem
INVALID_CURSOR ORA-01001 Neplatné operace kurzoru, jako je zavírání neotevřeného kurzoru
NEPLATNÉ ČÍSLO ORA-01722 Převod znaku na číslo se nezdařil z důvodu neplatného znaku čísla
NENALEZENA ŽÁDNÁ DATA ORA-01403 Když příkaz 'SELECT', který obsahuje klauzuli INTO, nenačte žádné řádky.
ROW_MISMATCH ORA-06504 Když je datový typ proměnné kurzoru nekompatibilní se skutečným návratovým typem kurzoru
SUBSCRIPT_BEYOND_COUNT ORA-06533 Odkazování na kolekci číslem indexu, které je větší než velikost kolekce
SUBSCRIPT_OUTSIDE_LIMIT ORA-06532 Odkazující kolekce podle indexového čísla, které je mimo zákonný rozsah (např .: -1)
TOO_MANY_ROWS ORA-01422 Když příkaz 'SELECT' s klauzulí INTO vrátí více než jeden řádek
VALUE_ERROR ORA-06502 Chyba omezení aritmetiky nebo velikosti (např .: přiřazení hodnoty proměnné, která je větší než proměnná velikost)
ZERO_DIVIDE ORA-01476 Dělení čísla číslem „0“

Uživatelem definovaná výjimka

V Oracle může programátor kromě výše předdefinovaných výjimek vytvořit vlastní výjimku a zpracovat je. Mohou být vytvořeny na úrovni podprogramu v deklarační části. Tyto výjimky jsou viditelné pouze v tomto podprogramu. Výjimka, která je definována ve specifikaci balíčku, je veřejná výjimka a je viditelná všude, kde je balíček přístupný. <

Syntaxe: Na úrovni podprogramu

DECLARE EXCEPTION;BEGINEXCEPTIONWHEN  THENEND;
  • Ve výše uvedené syntaxi je proměnná 'exception_name' definována jako typ 'EXCEPTION'.
  • To lze použít podobně jako předdefinovaná výjimka.

Syntaxe: Na úrovni specifikace balíčku

CREATE PACKAGE 
IS EXCEPTION;… END 
;
  • Ve výše uvedené syntaxi je proměnná 'exception_name' definována jako 'EXCEPTION' ve specifikaci balíčku .
  • To lze použít v databázi, kdekoli lze volat balíček 'název_balíku'.

Výjimka pro zvýšení PL / SQL

Všechny předdefinované výjimky jsou vyvolány implicitně, kdykoli dojde k chybě. Uživatelem definované výjimky je ale třeba explicitně vyvolat. Toho lze dosáhnout pomocí klíčového slova „RAISE“. To lze použít kterýmkoli ze způsobů uvedených níže.

Pokud se v programu použije 'RAISE' samostatně, rozšíří již vyvolanou výjimku do nadřazeného bloku. Lze použít pouze blok výjimek, jak je znázorněno níže.

CREATE [ PROCEDURE | FUNCTION ]ASBEGINEXCEPTIONWHEN  THENRAISE;END;

Vysvětlení syntaxe:

  • Ve výše uvedené syntaxi se v bloku zpracování výjimek používá klíčové slovo RAISE.
  • Kdykoli program narazí na výjimku „název_výjimky“, výjimka je zpracována a bude dokončena normálně
  • Ale klíčové slovo 'RAISE' v části zpracování výjimek rozšíří tuto konkrétní výjimku na nadřazený program.

Poznámka: Při zvyšování výjimky na nadřazený blok by výjimka, která se zvyšuje, měla být viditelná také na nadřazeném bloku, jinak Oracle způsobí chybu.

  • Můžeme použít klíčové slovo 'RAISE' následované názvem výjimky ke zvýšení této konkrétní uživatelem definované / předdefinované výjimky. To lze použít v prováděcí části i v části zpracování výjimek ke zvýšení výjimky.
CREATE [ PROCEDURE | FUNCTION ]ASBEGINRAISE EXCEPTIONWHEN  THENEND;

Vysvětlení syntaxe:

  • Ve výše uvedené syntaxi se v části provádění používá klíčové slovo RAISE, za kterým následuje výjimka „název_výjimky“.
  • Tím se zvýší tato konkrétní výjimka v době provedení a je třeba ji dále zpracovat nebo zvýšit.

Příklad 1 : V tomto příkladu uvidíme

  • Jak deklarovat výjimku
  • Jak zvýšit deklarovanou výjimku a
  • Jak to šířit 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:/

Vysvětlení kódu:

  • Řádek kódu 2 : Deklarování proměnné 'sample_exception' jako typu EXCEPTION.
  • Řádek kódu 3 : Postup deklarace nested_block.
  • Řádek kódu 6 : Tisk prohlášení „Uvnitř vnořeného bloku“.
  • Řádek kódu 7: Tisk prohlášení „Zvyšování sample_exception z vnořeného bloku.“
  • Řádek kódu 8: Zvýšení výjimky pomocí 'RAISE sample_exception'.
  • Řádek kódu 10: Obslužná rutina výjimky pro výjimku sample_exception ve vnořeném bloku.
  • Řádek kódu 11: Tisk prohlášení „Výjimka zachycena ve vnořeném bloku. Zvyšování do hlavního bloku “.
  • Řádek kódu 12: Zvyšování výjimky na hlavní blok (šíření do hlavního bloku).
  • Řádek kódu 15: Tisk prohlášení „Uvnitř hlavního bloku“.
  • Řádek kódu 16: Tisk výpisu „Volání vnořeného bloku“.
  • Řádek kódu 17: Volání procedury nested_block.
  • Řádek kódu 19: Obslužná rutina výjimky pro sample_exception v hlavním bloku.
  • Řádek kódu 20: Tisk prohlášení „Výjimka zachycena v hlavním bloku.“

Důležité body k poznámce ve Výjimce

  • Ve funkci by výjimka měla vždy buď vrátit hodnotu, nebo výjimku dále zvýšit. jinak Oracle za běhu hodí chybu „Funkce vrácena bez hodnoty“.
  • Výkazy řízení transakcí lze vydat v bloku zpracování výjimek.
  • SQLERRM a SQLCODE jsou vestavěné funkce, které poskytnou zprávu a kód výjimky.
  • Pokud není zpracována výjimka, budou ve výchozím nastavení vráceny zpět všechny aktivní transakce v dané relaci.
  • RAISE_APPLICATION_ERROR (- , ) lze použít místo RAISE ke zvýšení chyby pomocí uživatelského kódu a zprávy. Chybový kód by měl být větší než 20 000 a měl by mít předponu '-'.

souhrn

Po této kapitole. měli byste být schopni pracovat pro následující aspekty výjimek Pl SQL

  • Zpracování výjimek
  • Definujte výjimku
  • Zvyšte výjimku
  • Šíření výjimek