Minimálním příkladem je:
CREATE FUNCTION raise_exception RETURN INT
IS
BEGIN
RAISE NO_DATA_FOUND;
END;
/
Pokud tak učiníte:
SELECT raise_exception
FROM DUAL;
Získáte jeden řádek obsahující NULL
hodnota – Zeptejte se Toma uvádí:
a poté následuje:
Takže výjimka je vyvolána ve funkci a klient SQL to vidí a interpretuje to, protože neexistují žádná data, která mají NULL
hodnotu a „zpracuje“ výjimku.
Takže
DECLARE
variable_name VARCHAR2(50);
BEGIN
SELECT raise_exception
INTO variable_name
FROM DUAL
END;
/
Bude úspěšný jako DUAL
tabulka má jeden řádek a výjimka z funkce bude zpracována (potichu) a proměnná skončí obsahující NULL
hodnotu.
Nicméně,
BEGIN
DBMS_OUTPUT.PUT_LINE( raise_exception );
END;
/
Výjimka je tentokrát předána z funkce do rozsahu PL/SQL – který chybu nezpracovává a předá výjimku bloku obsluhy výjimek (který neexistuje), takže je předán do rozsahu aplikace a ukončuje provádění programu.
A Ask Tom uvádí:
Nyní, když změníme funkci tak, aby vyvolala jinou výjimku:
CREATE OR REPLACE FUNCTION raise_exception RETURN INT
IS
BEGIN
RAISE ZERO_DIVIDE;
END;
/
Pak obojí:
SELECT raise_exception
FROM DUAL;
a:
BEGIN
DBMS_OUTPUT.PUT_LINE( raise_exception );
END;
/
nevím, jak zpracovat výjimku a ukončit s ORA-01476 divisor is equal to zero
.