[PL/SQL] Exception NO_DATA_FOUND

Fermé
B@|-|@N Messages postés 386 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 7 décembre 2007 - 16 janv. 2006 à 16:11
 yannsar - 16 janv. 2006 à 17:10
Bonjour à toutes et à tous.

Débutant en PL/SQL avec une doc assez mince et n'ayant pas d'accès au web si ce n'est limité (très limité), je voudrais vous poser une question.

Voilà à quoi ressemble mon code, pour l'instant :

DECLARE
      var1     NUMBER;
      SELECT 1 INTO var1 FROM table1 WHERE champ1='toto';
      var2       table2.champ2%TYPE;
      SELECT champ2 INTO var2 FROM table2;
BEGIN
      IF var1 =1 THEN
            UPDATE table3 blablabla;
            COMMIT;
      END IF;
EXCEPTION
      WHEN NO_DATA_FOUND THEN
           INSERT INTO table3 blablabla2
           COMMIT;
END;


Mon problème vient de l'exception NO_DATA_FOUND. Bon, l'explication du code est la suivante :
    - La requête qui impacte table1 va avoir ou non un enregistrement parmi plusieurs répondant à la clause champ1='toto'.
    - Le résultat de cette requête est envoyée dans la variable var1.
    - L'exception NO_DATA_FOUND va traiter en fait le cas où il n'y aurait pas d'enregistrement répondant à la clause champ1='toto'.

Le truc, c'est que je ne sais pas si l'exception NO_DATA_FOUND va se lever si dans ma deuxième requête, il n'y a pas d'enregistrement ?

En gros, si on définit plusieurs requêtes dans le DECLARE et qu'on lève l'exception NO_DATA_FOUND. Est-ce qu'on va "aller" dans cette exception si n'importe quelle requête ne ramène pas d'enregistrement, ou alors est-ce que je peux clairement affecter cette exception NO_DATA_FOUND à une requête particulière ?

Bahan, compliquééééé X_X
A voir également:

3 réponses

logiquement, tu créées un curseur dans ton declare :
cursor toto is
select tata from table1;

cursor titi is
select tutu from table2;

puis dans ton begin, tu ouvres ton 1er curseur par exemple
open toto;
loop
fetch toto into var_toto;
exit when toto%notfound;

close toto;

voilou
2
B@|-|@N Messages postés 386 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 7 décembre 2007 62
16 janv. 2006 à 16:56
Et ça ne va pas provoquer une exception ?

Parce que dans ma requête 1, je ne ramène en fait qu'un seul enregistrement, donc c'est plus ou moins y a un enregistrement ou y en n'a pas.

L'attribut %NOTFOUND couvre ce genre de situation ?

Bahan
1
Pour que ton exception marche, il faut que ta requete soit à l'interieur de ton begin (si mes souvenirs sont bons).

le probleme c'est que tu ne peux faire un select a l'interieur de ton begin qu'en passant par un curseur.

Mais pour repondre à ta question, l'attribut notfound repond bien à cette situation
0