Précédent   Forum du club des développeurs et IT Pro > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 12/12/2012, 11h39   #1
jplec
Invité de passage
 
Inscription : décembre 2010
Messages : 10
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 10
Points : 1
Points : 1
Par défaut Utilisation du MERGE

Bonjour,

Dans le but d'optimiser l'insertion d'enregistrements dans une table pour notamment éviter les doublons, j'essaie d'utiliser la commande MERGE mais j'ai l'erreur de syntaxe incorrecte. N'étant pas un pro de l'anglais j'ai sans doute mal compris certains points de la doc Oracle...

Voici ma requête :
Code :
1
2
3
4
5
6
 
  Merge INTO MA_TABLE USING Dual ON (SELECT 1 FROM MA_TABLE WHERE MA_TABLE.ID=IdH)
  When MATCHED Then 
    UPDATE SET MA_TABLE.ID = IdH, MA_TABLE.DATE = Sysdate
  When NOT MATCHED Then 
    INSERT INTO MA_TABLE(ID) VALUES(IdH);
Où IdH est un paramètre de ma procédure.

Ma base est en version 9i et j'utilise un TOAD en version 9 également.

Merci pour vos lumières
jplec est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2012, 12h05   #2
Waldar
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 6 278
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 35
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : septembre 2008
Messages : 6 278
Points : 13 549
Points : 13 549
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Essayez ainsi :
Code :
1
2
3
4
5
6
7
 MERGE INTO MA_TABLE mt
 USING (SELECT IdH FROM DUAL) sr
    ON (mt.ID = sr.IdH)
  When MATCHED Then 
UPDATE SET mt.DATE = Sysdate
  When NOT MATCHED Then 
INSERT (mt.ID) VALUES (sr.IdH); -- Pas de sysdate dans Date ?
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2012, 12h54   #3
jplec
Invité de passage
 
Inscription : décembre 2010
Messages : 10
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 10
Points : 1
Points : 1
Citation:
Envoyé par Waldar Voir le message
Essayez ainsi :
Code :
1
2
3
4
5
6
7
 MERGE INTO MA_TABLE mt
 USING (SELECT IdH FROM DUAL) sr
    ON (mt.ID = sr.IdH)
  When MATCHED Then 
UPDATE SET mt.DATE = Sysdate
  When NOT MATCHED Then 
INSERT (mt.ID) VALUES (sr.IdH); -- Pas de sysdate dans Date ?
Merci pour ce retour.

En effet pas de sysdate à l'insert car ce champ est renseigné par trigger.

J'ai trouvé mon erreur... Elle est très bête : j'ai oublié de retirer le ";" à la fin de la déclaration de ma procédure

Merci encore pour le temps passé sur mon problème
jplec est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2012, 15h11   #4
mnitu
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 4 115
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 : 4 115
Points : 8 010
Points : 8 010
J’ai l’impression qu’une nouvelle légende travers le monde des développeurs d’Oracle avec l’utilisation du merge qui sera la plus performante de toutes les misses à jour possible ce qui est totalement faux.

Si ce que vous essayez d’accomplir via l’utilisation (abusive) du merge est de mettre à jour ou d’insérer une seul ligne dans une procédure PL/SQL alors utilisez plutôt
Code :
1
2
3
4
5
6
 
UPDATE ma_table SET madate = sysdate
 WHERE id = idh
IF sql%rowcount = 0 Then
  INSERT INTO ma_table(id) VALUES(idh)
End IF;
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 08h55.


 
 
 
 
Partenaires

Hébergement Web