Ein Minimalbeispiel ist:
CREATE FUNCTION raise_exception RETURN INT
IS
BEGIN
RAISE NO_DATA_FOUND;
END;
/
Wenn ja:
SELECT raise_exception
FROM DUAL;
Sie erhalten eine einzelne Zeile, die einen NULL
enthält Wert - Frag Tom Zustände:
und dann gefolgt von:
Die Ausnahme wird also in der Funktion ausgelöst und der SQL-Client sieht dies und interpretiert dies, da es keine Daten gibt, die ein NULL
sind Wert und "handhabt" die Ausnahme.
Also
DECLARE
variable_name VARCHAR2(50);
BEGIN
SELECT raise_exception
INTO variable_name
FROM DUAL
END;
/
Erfolgreich als DUAL
Die Tabelle hat eine einzelne Zeile und die Ausnahme von der Funktion wird (stillschweigend) behandelt und die Variable enthält am Ende einen NULL
Wert.
Allerdings
BEGIN
DBMS_OUTPUT.PUT_LINE( raise_exception );
END;
/
Die Ausnahme wird dieses Mal von der Funktion an einen PL/SQL-Bereich übergeben, der den Fehler nicht behandelt und die Ausnahme an den Ausnahmebehandlungsblock (der nicht existiert) weiterleitet, sodass er dann an den Anwendungsbereich weitergeleitet wird und die Ausführung beendet des Programms.
Und Ask Tom sagt:
Wenn wir nun die Funktion ändern, um eine andere Ausnahme auszulösen:
CREATE OR REPLACE FUNCTION raise_exception RETURN INT
IS
BEGIN
RAISE ZERO_DIVIDE;
END;
/
Dann beides:
SELECT raise_exception
FROM DUAL;
und:
BEGIN
DBMS_OUTPUT.PUT_LINE( raise_exception );
END;
/
weiß nicht, wie die Ausnahme behandelt werden soll, und endet mit ORA-01476 divisor is equal to zero
.