Zpracování výjimek Oracle PL/SQL (příklady)
Co je zpracování výjimek v PL/SQL?
Výjimka nastane, když stroj 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 nutné je zpracovat pouze za běhu.
Pokud například PL/SQL engine obdrží instrukci k dělení libovolného čísla '0', pak to PL/SQL engine vyvolá jako výjimku. Výjimka je vyvolána pouze za běhu strojem PL/SQL.
Výjimky zastaví další provádění programu, takže aby se takovému stavu zabránilo, je třeba je zachytit a zpracovat samostatně. Tento proces se nazývá Exception-Handling, ve kterém programátor zpracovává výjimku, která může nastat v době běhu.
Syntaxe zpracování výjimek
Výjimky jsou zpracovávány na úrovni bloku, tj. jakmile dojde k jakékoli výjimce v libovolném bloku, ovládací prvek vyjde z prováděcí části tohoto bloku. Výjimka pak bude zpracována v části pro zpracování výjimek tohoto bloku. Po zpracování výjimky není možné znovu odeslat řízení zpět do prováděcí části daného bloku.
Níže uvedená syntaxe vysvětluje, jak zachytit a zpracovat výjimku.
BEGIN <execution block> . . EXCEPTION WHEN <exceptionl_name> THEN <Exception handling code for the “exception 1 _name’' > WHEN OTHERS THEN <Default exception handling code for all exceptions > END;
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ého se očekává, že bude vyvolán za běhu.
- Když je za běhu vyvolána jakákoli výjimka, PL/SQL engine bude hledat v části zpracování výjimek tuto konkrétní výjimku. Začne od první klauzule 'WHEN' a postupně bude hledat.
- Pokud nalezne zpracování výjimky pro výjimku, která byla vyvolána, provede tuto konkrétní část manipulačního kódu.
- Pokud pro výjimku, která byla vyvolána, není přítomna žádná z klauzule 'WHEN', pak stroj PL/SQL provede část 'WHEN OTHERS' (pokud existuje). To je společné pro všechny výjimky.
- Po provedení výjimky přejde kontrola součásti z aktuálního bloku.
- Pro blok lze za běhu provést pouze jednu výjimku. Po jeho provedení ovladač přeskočí zbývající část zpracování výjimek a opustí aktuální blok.
Poznámka: KDYŽ OSTATNÍ by měli být vždy na poslední pozici sekvence. Část zpracování výjimek přítomná po WHEN OTHERS nebude nikdy provedena, protože ovládací prvek opustí blok po provedení WHEN OTHERS.
Typy výjimek
Existují dva typy výjimek Pl/SQL.
- Předdefinované výjimky
- Uživatelsky definovaná výjimka
Předdefinované výjimky
Oracle předdefinoval nějakou společnou výjimku. 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 Oracle. V kódu můžeme tyto předdefinované názvy výjimek přímo použít k jejich zpracování.
Níže je uvedeno 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ě EXISTS) nebo přístup k atributům kolekce v neinicializovaných kolekcích |
CURSOR_ALREADY_OPEN | ORA-06511 | Pokus o otevření a kurzor která je již otevřena |
DUP_VAL_ON_INDEX | ORA-00001 | Uložení duplicitní hodnoty do databázového sloupce, který je omezen jedinečným indexem |
INVALID_CURSOR | ORA-01001 | Nepovolené operace kurzoru, jako je zavření neotevřeného kurzoru |
NEPLATNÉ ČÍSLO | ORA-01722 | Převod znaku na číslo se nezdařil z důvodu neplatného číselného znaku |
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 | Odkazující na kolekci indexovým číslem, které je větší než velikost kolekce |
SUBSCRIPT_OUTSIDE_LIMIT | ORA-06532 | Odkazování kolekce indexovým číslem, které je mimo povolený 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 | Aritmetická chyba nebo chyba omezení velikosti (např.: přiřazení hodnoty proměnné, která je větší než velikost proměnné) |
ZERO_DIVIDE | ORA-01476 | Dělení čísla '0' |
Uživatelsky definovaná výjimka
In Oracle, kromě výše předdefinovaných výjimek může programátor 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_name> EXCEPTION; BEGIN <Execution block> EXCEPTION WHEN <exception_name> THEN <Handler> END;
- Ve výše uvedené syntaxi je proměnná 'exception_name' definována jako typ 'EXCEPTION'.
- To lze použít podobným způsobem jako předdefinovanou výjimku.
Syntaxe:Na úrovni Specifikace balíčku
CREATE PACKAGE <package_name> IS <exception_name> EXCEPTION; . . END <package_name>;
- Ve výše uvedené syntaxi je proměnná 'exception_name' definována jako typ 'EXCEPTION' ve specifikaci balíčku .
- To lze v databázi použít všude tam, kde lze zavolat balíček 'název_balíčku'.
Výjimka zvýšení PL/SQL
Všechny předdefinované výjimky jsou vyvolány implicitně, kdykoli dojde k chybě. Výjimky definované uživatelem však musí být výslovně uvedeny. Toho lze dosáhnout pomocí klíčového slova 'RAISE'. To lze použít kterýmkoli z níže uvedených způsobů.
Pokud je 'RAISE' v programu použito samostatně, rozšíří již vyvolanou výjimku do nadřazeného bloku. Pouze v bloku výjimky lze použít, jak je uvedeno níže.
CREATE [ PROCEDURE | FUNCTION ] AS BEGIN <Execution block> EXCEPTION WHEN <exception_name> THEN <Handler> RAISE; END;
Vysvětlení syntaxe:
- Ve výše uvedené syntaxi je klíčové slovo RAISE použito v bloku zpracování výjimek.
- 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 do nadřazeného programu.
Poznámka: Při zvýšení výjimky na nadřazený blok by měla být vyvolaná výjimka také viditelná v nadřazeném bloku, jinak Oracle vyvolá chybu.
- Pro vyvolání této konkrétní uživatelem definované/předdefinované výjimky můžeme použít klíčové slovo 'RAISE' následované názvem výjimky. To lze použít jak v prováděcí části, tak v části zpracování výjimek k vyvolání výjimky.
CREATE [ PROCEDURE | FUNCTION ] AS BEGIN <Execution block> RAISE <exception_name> EXCEPTION WHEN <exception_name> THEN <Handler> END;
Vysvětlení syntaxe:
- Ve výše uvedené syntaxi je v prováděcí části použito klíčové slovo RAISE následované výjimkou „název_výjimky“.
- To vyvolá tuto konkrétní výjimku v době provádění a je třeba ji dále zpracovat nebo upozornit.
Příklad 1: V tomto příkladu uvidíme
- Jak vyhlásit výjimku
- Jak vyvolat deklarovanou výjimku a
- Jak to propagovat do hlavního bloku
DECLARE Sample_exception EXCEPTION; PROCEDURE nested_block IS BEGIN Dbms_output.put_line(‘Inside nested block’); Dbms_output.put_line(‘Raising sample_exception from nested block’); RAISE sample_exception; EXCEPTION WHEN sample_exception THEN Dbms_output.put_line (‘Exception captured in nested block. Raising to main block’); RAISE, END; BEGIN Dbms_output.put_line(‘Inside main block’); Dbms_output.put_line(‘Calling nested block’); Nested_block; EXCEPTION WHEN sample_exception THEN Dbms_output.put_line (‘Exception captured in main block'); END: /
Vysvětlení kódu:
- Řádek kódu 2: Deklaruje proměnnou 'sample_exception' jako typ EXCEPTION.
- Řádek kódu 3: Deklarace procedury nested_block.
- Řádek kódu 6: Tisk příkazu „Uvnitř vnořeného bloku“.
- Řádek kódu 7: Tisk příkazu „Vyvolání sample_exception z vnořeného bloku“.
- Řádek kódu 8: Vyvolání výjimky pomocí 'RAISE sample_exception'.
- Řádek kódu 10: Ovladač výjimky pro výjimku sample_exception ve vnořeném bloku.
- Řádek kódu 11: Tisk příkazu 'Výjimka zachycena ve vnořeném bloku. Zvyšování na hlavní blok'.
- Řádek kódu 12: Zvýšení výjimky na hlavní blok (propagace do hlavního bloku).
- Řádek kódu 15: Tisk prohlášení „Uvnitř hlavního bloku“.
- Řádek kódu 16: Tisk příkazu „Volání vnořeného bloku“.
- Řádek kódu 17: Volání procedury nested_block.
- Řádek kódu 18: Výjimka
- Řádek kódu 19: Ovladač 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. jiný Oracle za běhu vyvolá chybu 'Funkce vrácena bez hodnoty'.
- Příkazy řízení transakcí lze zadat v bloku zpracování výjimek.
- SQLERRM a SQLCODE jsou vestavěné funkce, které poskytují zprávu o výjimce a kód.
- Pokud výjimka není zpracována, budou ve výchozím nastavení všechny aktivní transakce v dané relaci vráceny zpět.
- RAISE_APPLICATION_ERROR (- , ) lze použít místo RAISE k upozornění na chybu pomocí uživatelského kódu a zprávy. Kód chyby by měl být větší než 20000 XNUMX a předponou '-'.
Shrnutí
Po této kapitole. měli byste být schopni pracovat pro následující aspekty Pl SQL výjimky
- Zpracování výjimek
- Definujte výjimku
- Udělejte výjimku
- Šíření výjimek