Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/08/2011, 23h54   #1
Membre du Club
 
Inscription : novembre 2007
Messages : 132
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 132
Points : 44
Points : 44
Par défaut Tester si un enregistrement existe

Salut,

je veux juste tester si un enregistrement existe. Ca marche quand ca existe mais pas quand ca n'existe pas.
Voila mon code:

Code :
1
2
3
4
5
6
7
 
SELECT id INTO v_id FROM matable WHERE monchamp='blabla';
IF  (v_id > 0) THEN
        DBMS_OUTPUT.PUT_LINE('oui');
ELSE
        DBMS_OUTPUT.PUT_LINE('non');
END IF;
Le message d'erreur est le suivant:
ERROR at line 1:
ORA-01403: no data found
ORA-06512: at line 7


Comment je peux corriger cela?
helpcomm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2011, 00h55   #2
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Citation:
Envoyé par helpcomm Voir le message
je veux juste tester si un enregistrement existe.
C'est généralement une mauvaise idée, derrière le test d'une ligne il y a souvent un traitement or ce traitement ne s'executera pas si la ligne n'existe pas donc il suffit de lancer le traitement sans tester l'existance de la ligne, et si le traitement consiste à insérer si la ligne n'existe pas ou updater si elle existe alors il faut utiliser MERGE.

Mais pour répondre au problème présent, regarde SELECT INTO
Citation:
Cet ordre ne doit ramener qu'une ligne sous peine de générer l'exception NO_DATA_FOUND si aucune ligne n'est ramenée
ou TOO_MANY_ROWS si plus d'une ligne sont ramenées
Dans ton cas remplace ton code par :
Code :
1
2
3
4
5
6
7
8
9
10
begin 
  SELECT 1 INTO v_id 
    FROM matable 
   WHERE monchamp = 'blabla'
     AND rownum = 1;
        DBMS_OUTPUT.PUT_LINE('oui');
exception
  when no_data_found then
        DBMS_OUTPUT.PUT_LINE('non');
END;
S'il y a une contrainte d'unicité sur monchamp alors le "and rownum = 1" est inutile.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2011, 11h02   #3
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 813
Points : 5 813
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
SELECT count(*)
  INTO v_id 
  FROM sys.dual
 WHERE EXISTS (SELECT NULL
                      FROM matable 
                    WHERE monchamp='blabla'
                    );
  IF  (v_id > 0) THEN
        DBMS_OUTPUT.PUT_LINE('oui');
  ELSE
        DBMS_OUTPUT.PUT_LINE('non');
  END IF;
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/09/2011, 11h56   #4
Nouveau Membre du Club
 
Inscription : octobre 2007
Messages : 20
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 20
Points : 26
Points : 26
Code :
1
2
3
4
5
6
7
 
SELECT count(*) INTO v_id FROM matable WHERE monchamp='blabla';
IF  (v_id > 0) THEN
        DBMS_OUTPUT.PUT_LINE('oui');
ELSE
        DBMS_OUTPUT.PUT_LINE('non');
END IF;
athanaze est déconnecté   Envoyer un message privé Réponse avec citation 02
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h59.


 
 
 
 
Partenaires

Hébergement Web