Pourquoi aucune donnée trouvée ORA-01403 est une exception dans Oracle?

si L'instruction SELECT INTO ne renvoie pas au moins une ligne, ORA-01403 est lancée.

pour tous les autres SGBD, je sais que c'est normal sur un SELECT. Seul Oracle traite un SELECT comme ceci.

CREATE OR REPLACE PROCEDURE no_data_proc IS
   dummy dual.dummy%TYPE;
BEGIN
  BEGIN 
     SELECT dummy  
       INTO dummy
       FROM dual
      WHERE dummy = 'Y';   
  EXCEPTION 
     WHEN no_data_found THEN
        dbms_output.put_line('Why is this needed?');
  END;
END no_data_proc;

Pourquoi?

à mon avis, vous n'avez pas vraiment besoin de cette exception. C'est trop de frais généraux. Parfois, il est pratique, mais vous devez écrire un début entier, EXCEPTION, quand, bloc de fin.

existe-il des raisons essentielles je n'ai pas voir?

16
demandé sur OMG Ponies 2010-10-15 12:12:32

6 réponses

le bloc exception n'est pas nécessaire, vous pouvez l'utiliser ou non, selon le contexte.

ici vous ignorez activement l'exception (la procédure va revenir avec succès) mais la plupart du temps si vous faites un SELECT vous le voulez fail si elle ne renvoie pas une ligne, pensez à:

PROCEDURE update_employee_salary (p_empno) IS
   l_salary NUMBER;
BEGIN
   SELECT sal INTO l_salary FROM emp WHERE empno = p_empno FOR UPDATE;
   /* do something with emp data */
END;

ici je veux que ma fonction échoue si elle est appelée avec un empno cela n'existe pas dans la table EMP. Je pourrais attraper l'exception de élever un message d'erreur significatif (

en général, les seules exceptions que vous devriez attraper sont les exceptions attendues (c.-à-d. que ce ne devrait pas être la norme pour attraper tous les ORA-01403, ou toutes les exceptions pour cette matière).

18
répondu Vincent Malgrat 2010-10-15 08:36:13

mais nous devons encore répondre à la question de "pourquoi une exception est-elle lancée dans le cas où un SELECT n'a pas de données à récupérer".

je crois que c'est fait parce que c'est une situation qui, autrement, pourraient être négligé. Écrire du code comme s'il s'attendait toujours à trouver des données est une chose courante à faire, et si nous étions censés mettre en place des contrôles d'erreur tels que

SELECT <something...>
IF SQLCODE = 100 THEN -- No data found
  <no-data handler>
END IF

il est probable que la vérification de SQLCODE = 100 soit souvent omise. Avoir une exception a fait en sorte qu'il y ait eu une situation importante (aucune donnée trouvée) et que L'on n'ait pas tenu compte de cette situation. IMO avoir le moteur PL/SQL soulever une exception est mieux que d'avoir le programme continuer joyeusement sur sa route sous l'hypothèse que les données ont été récupérées alors qu'en fait, il n'était pas, ce qui peut conduire à toutes sortes de problèmes autres que joyeux.

partagez et profitez.

11
répondu Bob Jarvis 2010-10-15 15:21:37

Vous pouvez essayer L'utilisation MIN pour éviter la clause d'EXCEPTION.

 SELECT MIN(dummy)  
   INTO dummy
   FROM dual
  WHERE dummy = 'Y'; 

puis dummy variable sera NULL

6
répondu Michael Pakhantsov 2010-10-15 08:16:29

parce que vous faites SELECT dans lequel nécessite exactement une ligne (plus de lignes serait aussi une erreur).

Si vous pouvez avoir un ou pas de ligne, vous pouvez utiliser un curseur.

Ce n'est pas la base de données de décider pour vous qu'une ligne manquante n'est pas une erreur, et il suffit de régler la valeur null.

2
répondu Thilo 2010-10-15 08:16:11

parce qu'il n'est pas clair ce que le moteur PL/SQL devrait faire - devrait-il sortir du bloc? Doit-il Appuyer sur avec NULL dans la variable? Et si dans le bloc suivant vous essayez d'insérer une colonne not NULL, comment doit-on signaler l'emplacement de l'erreur? En faisant une exception vous oblige à être explicite à ce sujet.

1
répondu Gaius 2010-10-16 17:02:22

vous pouvez aussi utiliser le sql MAX ou MIN fonctions. Si aucune ligne n'est retournée, alors ces fonctions retourneront un NULL.

Par exemple: Sélectionnez MAX(colonne1) Dans la variable À Partir De La Table Où Colonne1 = 'Valeur';

MAX la fonction retournera la valeur maximale ou si aucune ligne n'est retournée, elle retournera NULL.

1
répondu Immortal Code 2015-11-18 15:26:18