Ett minimalt exempel är:
CREATE FUNCTION raise_exception RETURN INT
IS
BEGIN
RAISE NO_DATA_FOUND;
END;
/
Om du gör det:
SELECT raise_exception
FROM DUAL;
Du kommer att få en enda rad som innehåller en NULL
värde - Fråga Tom står:
och följde sedan upp med:
Så undantaget tas upp i funktionen och SQL-klienten ser detta och tolkar detta eftersom det inte finns någon data som är en NULL
värde och "hanterar" undantaget.
Så
DECLARE
variable_name VARCHAR2(50);
BEGIN
SELECT raise_exception
INTO variable_name
FROM DUAL
END;
/
Kommer att lyckas som DUAL
tabellen har en enda rad och undantaget från funktionen kommer att hanteras (tyst) och variabeln kommer att innehålla en NULL
värde.
Men
BEGIN
DBMS_OUTPUT.PUT_LINE( raise_exception );
END;
/
Undantaget överförs denna gång från funktionen till ett PL/SQL-scope - som inte hanterar felet och skickar undantaget till undantagshanterarblocket (som inte finns) så att det skickas upp till applikationsomfånget och avslutar exekvering av programmet.
Och Ask Tom säger:
Om vi nu ändrar funktionen för att skapa ett annat undantag:
CREATE OR REPLACE FUNCTION raise_exception RETURN INT
IS
BEGIN
RAISE ZERO_DIVIDE;
END;
/
Sedan båda:
SELECT raise_exception
FROM DUAL;
och:
BEGIN
DBMS_OUTPUT.PUT_LINE( raise_exception );
END;
/
vet inte hur man hanterar undantaget och avslutar med ORA-01476 divisor is equal to zero
.