Een minimaal voorbeeld is:
CREATE FUNCTION raise_exception RETURN INT
IS
BEGIN
RAISE NO_DATA_FOUND;
END;
/
Als je dat doet:
SELECT raise_exception
FROM DUAL;
U krijgt een enkele rij met een NULL
waarde - Vraag het aan Tom staten:
en vervolgde met:
Dus de uitzondering wordt opgeworpen in de functie en de SQL-client ziet dit en interpreteert dit omdat er geen gegevens zijn die een NULL
zijn waarde en "verwerkt" de uitzondering.
Dus
DECLARE
variable_name VARCHAR2(50);
BEGIN
SELECT raise_exception
INTO variable_name
FROM DUAL
END;
/
Zal slagen als de DUAL
tabel heeft een enkele rij en de uitzondering van de functie zal (stil) worden afgehandeld en de variabele zal uiteindelijk een NULL
bevatten waarde.
Echter,
BEGIN
DBMS_OUTPUT.PUT_LINE( raise_exception );
END;
/
De uitzondering is dat deze keer wordt doorgegeven van de functie naar een PL/SQL-scope - die de fout niet afhandelt en de uitzondering doorgeeft aan het exception-handlerblok (dat niet bestaat), zodat het wordt doorgegeven aan het toepassingsbereik en de uitvoering beëindigt van het programma.
En Ask Tom zegt:
Als we nu de functie wijzigen om een andere uitzondering op te werpen:
CREATE OR REPLACE FUNCTION raise_exception RETURN INT
IS
BEGIN
RAISE ZERO_DIVIDE;
END;
/
Dan beide:
SELECT raise_exception
FROM DUAL;
en:
BEGIN
DBMS_OUTPUT.PUT_LINE( raise_exception );
END;
/
weet niet hoe de uitzondering moet worden afgehandeld en moet eindigen met ORA-01476 divisor is equal to zero
.