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

 Oracle Discussion :

Test de présence d'une valeur dans une colonne de table


Sujet :

Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 227
    Points : 77
    Points
    77
    Par défaut Test de présence d'une valeur dans une colonne de table
    Bonjour.
    Je fais un déclencheur et dedans je dois tester si une valeur IdChercheur (varchar2(10)) est dans la colonne IdUniv(varchar2(10)) de la table UNIVERSITE.
    Quelle est la syntaxe en PL/SQL pour ce test (je sais simplement que ça commence par if) )?
    Merci.

  2. #2
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    si IdUniv, comme son nom semble l'indiquer subit une contrainte d'unicité (ou clé primaire) alors y'a bien plus simple que le trigger et plus adapté: la clé étrangère.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 227
    Points : 77
    Points
    77
    Par défaut
    En fait, j'ai simplifié l'énoncé.
    IdUniv est bien une clé primaire de la table UNIVERSITE formée de 6 chiffres, mais IdChercheur est formé de 10 chiffres dont les 6 premiers correspondent à l'identifiant d'une université. Donc je ne pense pas que dans ce cas on puisse utiliser une clé étrangère? J'ai plutôt pensé à un trigger:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    create or replace trigger valideIdChercheur
    before insert or update of IdChercheur on CHERCHEUR
    for each row
    declare cursor lignesUniv is select * from UNIVERSITE;
     
    begin
      for cur in lignesUniv loop
        if to_char(cur.IdUniv)=substr(:new.IdChercheur,1,6) then
          return;
        end if;
      end loop;
      RAISE_APPLICATION_ERROR(-20010, 'Identifiant non valide. Le début doit correspondre au numéro d''une université.');
    end;
    ça semble fonctionner mais il n'y a pas plus simple?

  4. #4
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Tu n'est pas obligé de passer par un curseur déclaré et surtout il faut que tu fasses une clause where sur un champ indexé histoire de ne pas faire un accès complet à ta table pour chaque ligne insérée, tu peux faire une requête du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    declare nn number;
    begin
    select count(1) into nn from UNIVERSITE where  
    IdUniv = to_number(substr(:new.IdChercheur,1,6));
    if (nn = 0) then
       RAISE_APPLICATION_ERROR(-20010, 'Identifiant non valide. Le début doit correspondre au numéro d''une université.');
    end if;
    end;
    Tu peux aussi faire un trigger qui remplisse l'équivalent de ton id université sur une nouvelle colonne de ta table qui elle pointera sur la table UNIVERSITE avec une clé étrangère.

    De manière générale, c'est plus propre et plus pratique à terme de ne pas mélanger plusieurs infos dans une même colonne (la preuve ici)

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 227
    Points : 77
    Points
    77
    Par défaut
    Merci remi4444, ça marche bien.
    Mais qu'est-ce qui se passe exactement quand on fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select count(1) into nn
      FROM UNIVERSITE
     WHERE  IdUniv = to_number(substr(:new.IdChercheur,1,6));
    Pourquoi c'est pas plutôt count(*)?

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    C'est maintenant pareil, count(1) est réécrit en count(*) par le parseur SQL.

  7. #7
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Citation Envoyé par JCD21 Voir le message
    Pourquoi c'est pas plutôt count(*)?
    C'est pareil, juste un vielle habitude, j'aime pas les "*" lol

    Sinon la requête compte le nombre de lignes ou il y a une correspondance entre les 6 premiers caractères de ton champ (d'ou le substr) et la clé de ta table université.

  8. #8
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Pour tester l'existence:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Select count(*)
      Into l_var
      From dual
     Where Exists (Select Null
                     From UNIVERSITE
                    Where  IdUniv = To_Number(Substr(:new.IdChercheur,1,6))
                  )

  9. #9
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Effectivement, c'est le plus pur... mais dans le cas présent il me semble que IdUniv étant unique, ça doit revenir au même en terme d'accès au données.

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/04/2015, 11h17
  2. Réponses: 1
    Dernier message: 15/07/2014, 17h57
  3. quand je selectionne une valeur dans une liste, retourne une autre valeur
    Par nsqualli dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 29/12/2008, 14h23
  4. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48
  5. Réponses: 1
    Dernier message: 25/09/2006, 17h15

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