Un exemple minimal est :
CREATE FUNCTION raise_exception RETURN INT
IS
BEGIN
RAISE NO_DATA_FOUND;
END;
/
Si vous le faites :
SELECT raise_exception
FROM DUAL;
Vous obtiendrez une seule ligne contenant un NULL
valeur - Demander à Tom indique :
puis suivi avec :
Ainsi, l'exception est levée dans la fonction et le client SQL le voit et l'interprète car il n'y a pas de données qui sont un NULL
valeur et "gère" l'exception.
Alors
DECLARE
variable_name VARCHAR2(50);
BEGIN
SELECT raise_exception
INTO variable_name
FROM DUAL
END;
/
Réussira en tant que DUAL
table a une seule ligne et l'exception de la fonction sera gérée (silencieusement) et la variable finira par contenir un NULL
valeur.
Cependant,
BEGIN
DBMS_OUTPUT.PUT_LINE( raise_exception );
END;
/
L'exception est cette fois passée de la fonction à une portée PL/SQL - qui ne gère pas l'erreur et transmet l'exception au bloc de gestionnaire d'exceptions (qui n'existe pas), puis est transmise à la portée de l'application et termine l'exécution du programme.
Et Demandez à Tom :
Maintenant, si nous modifions la fonction pour déclencher une exception différente :
CREATE OR REPLACE FUNCTION raise_exception RETURN INT
IS
BEGIN
RAISE ZERO_DIVIDE;
END;
/
Puis les deux :
SELECT raise_exception
FROM DUAL;
et :
BEGIN
DBMS_OUTPUT.PUT_LINE( raise_exception );
END;
/
ne sais pas comment gérer l'exception et terminer avec ORA-01476 divisor is equal to zero
.