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?
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).
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.
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
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.
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.
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.