Rechercher : dans
Par :

[PL/SQL] Exception NO_DATA_FOUND

Dernière réponse le 16 jan 2006 à 17:10:28 B@|-|@N, le 16 jan 2006 à 16:11:33 
 Signaler ce message aux modérateurs

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 Close the world.||.txen eht nepO

Meilleures réponses pour « [PL/SQL] Exception NO_DATA_FOUND » dans :
PL/SQL - Introduction au langage PL/SQL Voir Introduction au langage PL/SQL Le langage PL/SQL est un langage L4G (entendez par ce terme un langage de quatrième génération), fournissant une interface procédurale au SGBD Oracle. Le langage PL/SQL intègre parfaitement le langage SQL en lui...
SQL - Tri VoirTri des résultats Il est possible en SQL d'organiser les résultats grâce à la clause ORDER BY. La clause ORDER BY est suivie des mots clés ASC ou DESC, qui précisent respectivement si le tri se fait de manière croissante (par défaut) ou...
SQL - Jointures VoirExpression des jointures Une jointure (ou θ-jointure) est un produit cartésien de deux tables. On appelle équijointure une θ-jointure dont la qualification est une égalité entre deux colonnes. En SQL, l'expression d'une jointure se...
SQL - Restriction VoirExpression des restrictions Une restriction consiste à sélectionner les lignes satisfaisant à une condition logique effectuée sur leurs attributs. En SQL, les restrictions s'expriment à l'aide de la clause WHERE suivie d'une condition logique...

1

yannsar, le 16 jan 2006 à 16:34:29

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

Répondre à yannsar

2

B@|-|@N, le 16 jan 2006 à 16:56:19

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 Close the world.||.txen eht nepO

Répondre à B@|-|@N

3

 yannsar, le 16 jan 2006 à 17:10:28

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

Répondre à yannsar