EXCEPTION
ďalšie názvy článku: SQLCODE, SQLERRM
]Podporované v Oracle
Popis
Príkaz jazyka SQL
V mnoha programovacích jazycích platí, že běhové chyby zastaví program a vrací kontrolu operačnímu systému. Pokud existuje mechanismus ošetřování vyjímek (jako je tomu např. právě v PL/SQL), je možné pokračovat ve výpočtu i po chybě a udělat tak program stabilnější a uživatelsky příznivější.
Běhové chyby lze rozdělit na:
- Chyby v návrhu (algoritmu, ...)
- Chyby v kódu
- Hardwarové chyby
- Jiné problémy
Přehled
Vyjímky v PL/SQL můžeme rozdělit na
- Vnitřní - definované systémem (dělení nulou, nedostatek paměti, ...)
- Uživatelské - definované uživatelem / programátorem
Některé z běžných vnitřních vyjímek mají i svá zástupná jména (např. výše zmíněným odpovídají ZERO_DIVIDE a STORAGE_ERROR), případně je lze dodatečně pojmenovat. Uživatelské vyjímky jsou pojmenovány vždy.
V případě, že v průběhu výpočtu programu nastane chyba, je vyvolána příslušná vyjímka (aicky při vnitřní vyjímce, či explicitně pomocí přikazu RAISE). K ošetření vyvolané vyjímky se používá exception handler, který zastaví právě vykonávaný blok a po svém skončení výpočet pokračuje.
- Předdefinované vyjímky jsou deklarovány globálně v balíčku STANDARD.
- Vyjímky jsou jednoznačně identifikovány čísly.
- Pojmenované vyjímky je možné zachytávat za pomoci jména (např. WHEN <JMENO_VYJIMKY> THEN ...).
- Nepojmenované lze odchytit pouze za pomoci speciálního handleru OTHERS (WHEN OTHERS THEN ...).
Dále je možné využít funkce
- SQLCODE - sloužící k navrácení čísla chyby
- SQLERRM - sloužící k zobrazování chybové zprávy
Príklad
DECLARE
pe_ratio NUMBER(3,1);
BEGIN
SELECT price / earnings INTO pe_ratio FROM stocks
WHERE symbol = 'XYZ'; -- might cause division-by-zero error
INSERT INTO stats (symbol, ratio) VALUES ('XYZ', pe_ratio);
COMMIT;
EXCEPTION -- Exception handler
WHEN ZERO_DIVIDE THEN -- handles 'division by zero' error
INSERT INTO stats (symbol, ratio) VALUES ('XYZ', NULL);
COMMIT;
...
WHEN OTHERS THEN -- handles all other errors
ROLLBACK;
dbms_output.put_line(SubStr('Error '||TO_CHAR(SQLCODE)||': '||SQLERRM, 1, 255));
END; -- exception handlers and block end here
pe_ratio NUMBER(3,1);
BEGIN
SELECT price / earnings INTO pe_ratio FROM stocks
WHERE symbol = 'XYZ'; -- might cause division-by-zero error
INSERT INTO stats (symbol, ratio) VALUES ('XYZ', pe_ratio);
COMMIT;
EXCEPTION -- Exception handler
WHEN ZERO_DIVIDE THEN -- handles 'division by zero' error
INSERT INTO stats (symbol, ratio) VALUES ('XYZ', NULL);
COMMIT;
...
WHEN OTHERS THEN -- handles all other errors
ROLLBACK;
dbms_output.put_line(SubStr('Error '||TO_CHAR(SQLCODE)||': '||SQLERRM, 1, 255));
END; -- exception handlers and block end here
Pozri aj
SQLERRM
]