Oracle
 sql >> Base de données >  >> RDS >> Oracle

L'exception NO_DATA_FOUND n'est pas levée lorsqu'elle est utilisée dans SELECT INTO

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 .