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 :

Trigger Oracle remplacant un INSERT par un UPDATE


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut Trigger Oracle remplacant un INSERT par un UPDATE
    Bonjour, j'ai un programme qui réalise des INSERT dans une table.

    Je souhaiterais (si possible) créer un Trigger Oracle qui, avant d'effectuer l'INSERT, vérifie l'existence d'un enregistrement semblable dans la base et auquel cas réalise un UPDATE de cet enregistrement plutôt qu'un INSERT dans la base.

    Je vais tenter d'expliquer ce que je veut faire a l'aide d'un exemple bateau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    -----------------
    PERSONNE
    -----------------
    ID_PERSONNE (PK de la table )
    NOM
    PRENOM
    DATE_NAISS
    VILLE
    TAILLE
    Lorsque j'effectue une requete INSERT comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO PERSONNE ( ID_PERSONNE, NOM, PRENOM, DATE_NAISS, VILLE, TAILLE)
    VALUES( 758, 'DUPOND', 'MARC', '10/05/1978', 'PARIS', 80 )
    Imaginons qu'il existe un enregistrement dans la table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    123 | DUPOND | MARC | 10/05/1978 | MARSEILLE | 75
    Je souhaiterais que lors de l'INSERT, mon TRIGGER trouve l'enregistrement comportant les même NOM, PRENOM, et DATE_NAISS, et que si un enregistrement existe, plutot que de faire l'INSERT prévu, il réalise un UPDATE de l'enregistrement existant, qui deviendra donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    123 | DUPOND | MARC | 10/05/1978 | PARIS| 80
    Donc ma question est : est-ce-que ca vous semble possible?

    J'espere avoir été clair dans ma requête, si ce n'est pas le cas n'hésiter pas a me le signaler!

    Merci a ceux qui pourront m'aider!

  2. #2
    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
    Nul besoin d'un trigger quand on dispose d'une instruction: MERGE.

  3. #3
    Membre Expert Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Par défaut
    Bonjour ,
    Ca depend ... de la version Oracle

    comme aparemment il y a encore des entreprises qui utilisent oracle 6 ici , mieux
    vaut se mefier

  4. #4
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Nul besoin d'un trigger quand on dispose d'une instruction: MERGE.
    Seulement voilà, le demandeur a juste oublié d'indiquer la version de la base qu'il utilise...

  5. #5
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    J'utilise Oracle 9, donc l'instruction MERGE existe bien.
    Je ne connaissais pas cette instruction, qui semble effectivement correspondre a ce que je souhaite faire!

    Par contre, je dois être un boulet mais j'arrive pas a l'utiliser dans mon cas!

  6. #6
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    Après un bon petit triturage de cerveau, il semblerai que je commence a m'approcher du but!

    Voilà l'instruction a laquelle je suis arrivé (pour illustrer l'exemple de ma première question) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    MERGE INTO PERSONNE T1
      USING (SELECT * FROM PERSONNE where nom = 'DUPOND' and prenom='MARC' and date_naiss='10/05/1978') T2
        ON ( 
              T1.nom         = t2.nom and
              T1.prenom      = t2.prenom  and
              T1.date_naiss  = t1.date_naiss
           ) -- Condition de correspondance
    WHEN MATCHED THEN -- Si Vraie
      UPDATE SET VILLE= 'PARIS',  poids = 80
     
    WHEN NOT MATCHED THEN -- Si faux
      INSERT ( ID_PERSONNE, NOM, PRENOM,DATE_NAISS, VILLE, TAILLE ) VALUES ( 758, 'DUPOND', 'MARC', '10/05/1978', 'PARIS',80 );
    Cette instruction fonctionne bien dans le cas de l'UPDATE (si un enregistrement existe) par contre l'INSERT ne s'effectue pas si aucun enregistrement existe.

    Je dois passer a coté de quelque chose, mais je n'arrive pas a identifier quoi!

    Avez-vous une idée?

  7. #7
    Membre Expert Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Par défaut
    Citation Envoyé par sat83 Voir le message
    Après un bon petit triturage de cerveau, il semblerai que je commence a m'approcher du but!

    Voilà l'instruction a laquelle je suis arrivé (pour illustrer l'exemple de ma première question) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    MERGE INTO PERSONNE T1
      USING (SELECT * FROM PERSONNE where nom = 'DUPOND' and prenom='MARC' and date_naiss='10/05/1978') T2
        ON ( 
              T1.nom         = t2.nom and
              T1.prenom      = t2.prenom  and
              T1.date_naiss  = t1.date_naiss
           ) -- Condition de correspondance
    WHEN MATCHED THEN -- Si Vraie
      UPDATE SET VILLE= 'PARIS',  poids = 80
     
    WHEN NOT MATCHED THEN -- Si faux
      INSERT ( ID_PERSONNE, NOM, PRENOM,DATE_NAISS, VILLE, TAILLE ) VALUES ( 758, 'DUPOND', 'MARC', '10/05/1978', 'PARIS',80 );
    Cette instruction fonctionne bien dans le cas de l'UPDATE (si un enregistrement existe) par contre l'INSERT ne s'effectue pas si aucun enregistrement existe.

    Je dois passer a coté de quelque chose a mon avis!

    Avez-vous une idée?
    tu fais 2 fois T1.date_naiss

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
              T1.nom         = t2.nom AND
              T1.prenom      = t2.prenom  AND
              T1.date_naiss  = t1.date_naiss
    c'est T1.date_naiss = t2.date_naiss

  8. #8
    Membre Expert Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103

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

Discussions similaires

  1. Remplacer dans trigger INSERT par UPDATE si clé existe
    Par Christop33 dans le forum Requêtes
    Réponses: 1
    Dernier message: 05/07/2011, 13h56
  2. Réponses: 6
    Dernier message: 16/04/2008, 10h06
  3. TRIGGER de type "for insert,update"
    Par samworld dans le forum Développement
    Réponses: 3
    Dernier message: 04/07/2007, 19h20
  4. Trigger d'insertion et d'update
    Par Shiva dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 01/01/2007, 14h32
  5. Réponses: 4
    Dernier message: 13/11/2006, 18h05

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