Et minimalt eksempel er:
CREATE FUNCTION raise_exception RETURN INT
IS
BEGIN
RAISE NO_DATA_FOUND;
END;
/
Hvis du gør det:
SELECT raise_exception
FROM DUAL;
Du får en enkelt række, der indeholder en NULL
værdi - Spørg Tom a> siger:
og derefter fulgt op med:
Så undtagelsen er rejst i funktionen, og SQL-klienten ser dette og fortolker dette, da der ikke er nogen data, som er en NULL
værdi og "håndterer" undtagelsen.
Så
DECLARE
variable_name VARCHAR2(50);
BEGIN
SELECT raise_exception
INTO variable_name
FROM DUAL
END;
/
Vil lykkes som DUAL
tabel har en enkelt række, og undtagelsen fra funktionen vil blive håndteret (stille), og variablen vil ende med at indeholde en NULL
værdi.
Dog
BEGIN
DBMS_OUTPUT.PUT_LINE( raise_exception );
END;
/
Undtagelsen bliver denne gang overført fra funktionen til et PL/SQL scope - som ikke håndterer fejlen og overfører undtagelsen til undtagelseshåndteringsblokken (som ikke eksisterer), så den bliver overført til applikationsomfanget og afslutter eksekveringen af programmet.
Og Spørg Tom udtaler:
Nu, hvis vi ændrer funktionen for at rejse en anden undtagelse:
CREATE OR REPLACE FUNCTION raise_exception RETURN INT
IS
BEGIN
RAISE ZERO_DIVIDE;
END;
/
Så begge dele:
SELECT raise_exception
FROM DUAL;
og:
BEGIN
DBMS_OUTPUT.PUT_LINE( raise_exception );
END;
/
ved ikke, hvordan man håndterer undtagelsen og afslutter med ORA-01476 divisor is equal to zero
.