Pokud jste programátor, možná znáte koncept zpracování výjimek, který je nedílnou součástí každého programovacího jazyka. Protože chyby jsou nevyhnutelné a i ti nejchytřejší z nás se mohou při psaní kódu mýlit, musíme být seznámeni s tím, jak s nimi zacházet. V tomto článku se budeme učit zejména o zpracování výjimek v PL/SQL.
Níže jsou uvedena témata obsažená v tomto článku:
- Co je to výjimka?
- Syntaxe zpracování výjimek
- Typy výjimek
- Definováno systémem
- Pojmenované systémové výjimky
- Nepojmenované systémové výjimky
- Uživatelsky definované
- Postup deklarace funkcí definovaných uživatelem
- Příklady funkcí definovaných uživatelem
- Definováno systémem
Co je to výjimka?
Jakýkoli abnormální stav nebo událost, která přerušuje normální tok instrukcí našeho programu za běhu nebo jednoduše řečeno výjimka, je chyba.
Syntaxe zpracování výjimek v PL/SQL
DECLARE <declarations section> BEGIN <executable command(s)> EXCEPTION <exception handling goes here > WHEN exception1 THEN exception1-handling-statements WHEN exception2 THEN exception2-handling-statements WHEN exception3 THEN exception3-handling-statements ........ WHEN others THEN exception3-handling-statements END;
Zde můžeme uvést tolik výjimek, kolik chceme zpracovat. Výchozí výjimka bude zpracována pomocí „WHEN other THEN“
Příklad zpracování výjimek v PL/SQL
Níže uvedený program zobrazuje jméno a adresu studenta, jehož ID je uvedeno. Protože v naší databázi není žádný student s hodnotou ID 8, program vyvolá výjimku za běhu NO_DATA_FOUND, která je zachycena v bloku EXCEPTION.
DECLARE s_id studentS.id%type := 8; s_name studentS.Name%type; s_loc studentS.loc%type; BEGIN SELECT name, loation INTO s_name, s_loc FROM students WHERE id = s_id; DBMS_OUTPUT.PUT_LINE ('Name: '|| s_name); DBMS_OUTPUT.PUT_LINE ('Location: ' || s_loc); EXCEPTION WHEN no_data_found THEN dbms_output.put_line('No such student!'); WHEN others THEN dbms_output.put_line('Oops, Error!'); END;
Výstup
No such student! PL/SQL procedure successfully completed.
Zde můžeme uvést tolik výjimek, kolik chceme zpracovat. Výchozí výjimka bude zpracována pomocí „KDYŽ ostatní PAK '
Typy výjimek v PL/SQL
- Definováno systémem
- Odpor uživatele
Dále v tomto článku o zpracování výjimek v PL/SQL probereme oba tyto typy podrobně.
Definováno systémem
Tyto výjimky jsou definovány a implicitně spravovány serverem Oracle a jsou definovány především v balíčku Oracle Standard Package. Kdykoli v programu dojde k výjimce, server Oracle se shoduje a identifikuje příslušnou výjimku z dostupné sady výjimek dostupných ve standardním balíčku Oracle. V zásadě jsou tyto výjimky předdefinované v PL/SQL, které se objeví KDYŽ dojde k porušení určitého databázového pravidla .
Výjimky definované systémem se dále dělí do dvou kategorií:
- Pojmenované systémové výjimky
- Nepojmenované systémové výjimky
Výjimky pojmenovaného systému
Jmenované výjimky PL/SQL jsou jmenovány ve standardním balíčku PL/SQL , proto vývojář nemusí ve svém kódu definovat výjimky PL/SQL. PL/SQL poskytuje mnoho předdefinovaných pojmenovaných výjimek, které se provádějí, když program poruší jakékoli databázové pravidlo. Následující tabulka uvádí několik důležitých předdefinovaných výjimek −
Výjimka | Chyba Oracle | SQLCODE | Popis |
ACCESS_INTO_NULL | 06530 | -6530 | Je aktivována, když je nulovému objektu automaticky přiřazena hodnota. |
CASE_NOT_FOUND | 06592 | -6592 | Je aktivována, když není vybrána žádná z možností v klauzuli WHEN příkazu CASE a neexistuje žádná klauzule ELSE. |
COLLECTION_IS_NULL | 06531 | -6531 | Je vyvoláno, když se program pokusí použít metody sběru jiné než EXISTS na neinicializovanou vnořenou tabulku nebo varray, nebo se program pokusí přiřadit hodnoty prvkům neinicializované vnořené tabulky nebo varray. |
DUP_VAL_ON_INDEX | 00001 | -1 | Vyvolá se, když se pokusíte uložit duplicitní hodnoty do sloupce s jedinečným indexem. |
INVALID_CURSOR | 01001 | -1001 | Je aktivována, když jsou provedeny pokusy o provedení operace kurzoru, která není povolena, jako je zavření neotevřeného kurzoru. |
INVALID_NUMBER | 01722 | -1722 | Vyvolá se, když se převod řetězce znaků na číslo nezdaří, protože řetězec nepředstavuje platné číslo. |
LOGIN_DENIED | 01017 | -1017 | Vyvolá se, když se program pokusí přihlásit do databáze s neplatným uživatelským jménem nebo heslem. |
NO_DATA_FOUND | 01403 | +100 | Je aktivována, když příkaz SELECT INTO nevrátí žádné řádky. |
NOT_LOGGED_ON | 01012 | -1012 | Vyvolá se, když je vydáno volání databáze bez připojení k databázi. |
PROGRAM_ERROR | 06501 | -6501 | Vyvolá se, když má PL/SQL vnitřní problém. |
ROWTYPE_MISMATCH | 06504 | -6504 | Je aktivována, když kurzor načte hodnotu v proměnné s nekompatibilním datovým typem. |
SELF_IS_NULL | 30625 | -30625 | Je vyvolána, když je vyvolána členská metoda, ale instance typu objektu nebyla inicializována. |
CHYBA STORAGE_ERROR | 06500 | -6500 | Vyvolá se, když PL/SQL došla paměť nebo byla poškozena paměť. |
TOO_MANY_ROWS | 01422 | -1422 | Je aktivována, když příkaz SELECT INTO vrátí více než jeden řádek. |
VALUE_ERROR | 06502 | -6502 | Je aktivována, když dojde k chybě aritmetiky, převodu, zkrácení nebo omezení velikosti. |
ZERO_DIVIDE | 01476 | 1476 | Je zvýšena, když je učiněn pokus o dělení čísla nulou. |
Příklad
CREATE OR REPLACE PROCEDURE add_new_student (student _id_in IN NUMBER, student _name_in IN VARCHAR2) IS BEGIN INSERT INTO student (student _id, student _name ) VALUES ( student _id_in, student _name_in ); EXCEPTION WHEN DUP_VAL_ON_INDEX THEN raise_application_error (-20001,'Duplicate student _id'); WHEN OTHERS THEN raise_application_error (-20002,'An error occurred.'); END;
V tomto článku o zpracování výjimek v PL/SQL budeme pokračovat v tom, co jsou nepojmenované systémové výjimky.
Nepojmenované systémové výjimky
Systémové výjimky, pro které Oracle nemá jméno, jsou známé jako nepojmenované systémové výjimky. Tyto výjimky se nevyskytují často a jsou zapsány s kódem a přidruženou zprávou.
Existují v zásadě dva způsoby, jak zpracovat nepojmenované systémové výjimky:
1. Použití obslužné rutiny výjimky WHEN OTHERS
2. Přiřazení kódu výjimky k názvu a jeho použití jako pojmenované výjimky.
Některé kroky pro nepojmenované systémové výjimky:
- Zvyšte je implicitně.
- V případě, že nejsou zpracovány v části „WHEN Others“, je třeba je zpracovat explicitně.
- Chcete-li výjimku zpracovat explicitně, mohou být deklarovány pomocí Pragma EXCEPTION_INIT a zpracovány odkazem na uživatelem definovaný název výjimky v sekci výjimek.
Příklad zpracování nepojmenovaných výjimek pomocí Pragma EXCEPTION_INIT je uveden dále v článku. V tomto článku o zpracování výjimek v PL/SQL budeme pokračovat, abychom pochopili uživatelem definované výjimky.
Definováno uživatelem
Stejně jako všechny ostatní programovací jazyky vám také Oracle umožňuje deklarovat implementaci reklam vlastními výjimkami. Na rozdíl od výjimek definovaných systémem jsou tyto výjimky vyvolány explicitně v bloku PL/SQL.
Postup deklarování výjimek definovaných uživatelem v databázi Oracle
Uživatelsky definované výjimky v databázi Oracle můžeme definovat následujícími 3 způsoby:
- Použití proměnné typu EXCEPTION
Zde můžeme deklarovat uživatelem definovanou výjimku deklarováním proměnné datového typu EXCEPTION v našem kódu a explicitně ji zvýšit v našem programu pomocí příkazu RAISE.
- Použití funkce PRAGMA EXCEPTION_INIT
Nepředdefinované číslo chyby můžeme definovat pomocí proměnné datového typu EXCEPTION
- Použití metody RAISE_APPLICATION_ERROR
Pomocí této metody můžeme deklarovat uživatelem definovanou výjimku s naším vlastním přizpůsobeným číslem chyby a zprávou.
Dosud jste možná měli přibližnou představu o způsobech, jakými můžeme vyvolávat uživatelem definované výjimky v PL/SQL. O každé z výše uvedených metod se dozvíme s příklady dále v tomto článku o zpracování výjimek v PL/SQL.
Dále v tomto článku budeme pokračovat s ukázkami zpracování výjimek definovaných uživatelem.
Ukázka výjimek definovaných uživatelem
V tomto článku o zpracování výjimek v PL/SQL budeme pokračovat v tom, jak používat proměnnou typu EXCEPTION.
Použití proměnné typu EXCEPTION
Proces deklarování uživatelem definované výjimky je rozdělen do tří částí a tyto 3 části jsou:
- Deklarujte datový typ výjimky proměnné
- Upozornit na výjimku
- Ošetření výjimky
Pojďme napsat kód, který podrobně demonstruje výše uvedené kroky.
DECLARE var_dividend NUMBER :=10; var_divisor NUMBER :=0 var_result NUMBER; ex-DivZero EXCEPTION
Ve výše uvedeném deklaračním bloku máme čtyři proměnné, z nichž první tři jsou proměnné datového typu s normálním počtem a čtvrtá, která je ex_DivZero, je speciální proměnná datového typu výjimky. Čtvrtá je naše uživatelsky definovaná výjimka.
DECLARE var_dividend NUMBER :=10; var_divisor NUMBER :=0 var_result NUMBER; ex-DivZero EXCEPTION
Výše uvedená prováděcí část tohoto anonymního bloku se aktivuje pouze tehdy, když je dělitel 0. Pokud je dělitel nula, jako je tomu v našem případě, dojde k chybě a ovládání programu přeskočí všechny další kroky a bude hledat odpovídající obsluhu výjimek. V případě, že najde nějakou jinou, provede příslušnou akci, jinak buď ukončí program, nebo nás vyzve s neošetřenou systémovou chybou.
EXCEPTION WHEN ex_DivZero THEN DBMS_OUTPUT.PUT_LINE(‘ ERROR, The divisor can’t be zero’);
Toto je obsluha výjimky. Jakmile uživatel zadá dělitele jako 0, zobrazí se dotaz na výše uvedený řetězec zprávy.
Konečný kód:
DECLARE var_dividend NUMBER :=10; var_divisor NUMBER :=0 var_result NUMBER; ex-DivZero EXCEPTION BEGIN IF var_divisor =0 THEN RAISE ex-DivZero; END IF; Var_result := var_dividend/var_divisor; DBMS_OUTPUT.PUT_LINE (‘Result = ‘ || var_result); BEGIN IF var_divisor =0 THEN RAISE ex-DivZero; END IF; Var_result := var_dividend/var_divisor; DBMS_OUTPUT.PUT_LINE (‘Result = ‘ || var_result); END;
V tomto článku o zpracování výjimek v PL/SQL budeme pokračovat, abychom pochopili, jak používat metodu PRAGMA_EXCEPTION_INIT.
Použití funkce PRAGMA EXCEPTION_INIT
Ve funkci PRAGMA EXCEPTION_INIT je název výjimky spojen s číslem chyby Oracle. Tento název lze použít při navrhování obslužné rutiny výjimky pro chybu. Pro velké projekty s mnoha uživateli definovanými chybami je PRAGMA EXCEPTION_INIT nejužitečnější a nejvhodnější metodou.
Syntaxe:
PRAGMA EXCEPTION_INIT(exception_name, -Oracle_error_number);
Příklad
DECLARE deadlock_detected EXCEPTION; PRAGMA EXCEPTION_INIT(deadlock_detected, -60); BEGIN NULL; -- Some operation that causes an ORA-00060 error EXCEPTION WHEN deadlock_detected THEN NULL; -- handle the error END;
PRAGMA EXCEPTION_INIT říká kompilátoru, aby přiřadil název výjimky k číslu chyby Oracle, jak bylo zmíněno dříve. Umožňuje vám odkazovat na jakoukoli interní výjimku jménem a napsat pro ni konkrétní handler. Když uvidíte zásobník chyb nebo posloupnost chybových zpráv, je možné zachytit a zpracovat to, které je nahoře.
V tomto článku o zpracování výjimek v PL/SQL budeme pokračovat, abychom pochopili, jak používat metodu RAISE_APPLICATION_ERROR.
Použití metody RAISE_APPLICATION_ERROR
Je to procedura, která je součástí softwaru oracle. Pomocí tohoto postupu můžeme přiřadit číslo chyby k vlastní chybové zprávě. Kombinací čísla chyby a vlastní chybové zprávy lze sestavit chybový řetězec, který vypadá podobně jako výchozí chybové řetězce, které oracle zobrazí, když dojde k chybě. Procedura RAISE_APPLICATION_ERROR se nachází v balíčku DBMS_STANDARD
Syntaxe
raise_application_error (error_number, message [, {TRUE | FALSE}]);
Příklad
/* A trigger trg_emp_detail_chk is created.*/ CREATE OR REPLACE TRIGGER trg_emp_detail_chk /* The trigger timing is declared as BEFORE UPDATE on the EMPLOYEES table.*/ Before UPDATE ON employees DECLARE permission_denied EXCEPTION; BEGIN /*Start of the IF condition checking whether the day of the system time is either Saturday or Sunday or not.*/ IF trim(TO_CHAR(sysdate,'Day')) IN ('Saturday', 'Sunday') THEN raise_application_error(-20000, 'You are not authorized to do any modification in the weekends!!'); /* The procedure raise_application_error is called with the first parameter value as -20000 and the second parameter with a default text stating that the user is not authorized to do any modification in the weekends. */ END IF; END;
Tím se dostáváme ke konci tohoto článku o „Zpracování výjimek v PL/SQL“. Doufám, že je toto téma dobře pochopeno a pomohlo vám. Zkuste si napsat své vlastní kódy a začlenit do nich metody popsané v tomto článku.
Pokud se chcete nechat vyškolit od profesionálů na tuto technologii, můžete se rozhodnout pro strukturované školení od edureky! Podívejte se na toto MySQL DBA Certification Training od Edureka, důvěryhodné online vzdělávací společnosti se sítí více než 250 000 spokojených studentů po celém světě. Tento kurz vás naučí základní koncepty a pokročilé nástroje a techniky pro správu dat a správu databáze MySQL. Zahrnuje praktické učení pojmů jako MySQL Workbench, MySQL Server, Data Modeling, MySQL Connector, Návrh databáze, Příkazový řádek MySQL, Funkce MySQL atd. Na konci školení budete schopni vytvořit a spravovat vlastní databázi MySQL a spravovat data.
Máte na nás otázku? Uveďte to prosím v sekci komentářů tohoto článku „Zpracování výjimek v PL/SQL“ a my se vám co nejdříve ozveme.