IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

Tester si un enregistrement existe


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2007
    Messages
    176
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 176
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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?

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  3. #3
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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;

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 25
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [LibreOffice][Tableur] Tester Enregistrement existe déjà dans BDD
    Par Mytå_Qc dans le forum OpenOffice & LibreOffice
    Réponses: 2
    Dernier message: 13/02/2013, 12h01
  2. Réponses: 2
    Dernier message: 14/12/2012, 12h42
  3. Tester si un enregistrement existe déjà en table
    Par qmike dans le forum Langage
    Réponses: 11
    Dernier message: 13/10/2009, 16h10
  4. Tester qu'une date existe
    Par Oluha dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 17/03/2005, 10h37
  5. [langage] tester si un fichier existe
    Par schnecke dans le forum Langage
    Réponses: 3
    Dernier message: 02/03/2004, 11h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo