Précédent   Forum des professionnels en informatique > 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 Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/06/2008, 18h16   #1
Membre du Club
 
Inscription : novembre 2003
Messages : 125
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : novembre 2003
Messages : 125
Points : 68
Points : 68
Par défaut Insertion d'une ligne existante : faire un SELECT ou ignorer ORA-00001 ?

Bonjour,

Une question concernant le gestion d'une ligne existante lors d'un INSERT.
Je vois deux méthodes:
-soit faire un SELECT avant l'INSERT pour tester si la ligne existe déjà. Si c'est le cas, on ne fait pas d'INSERT.
-soit faire l'INSERT en recevant un ORA-00001 (violation de contrainte) en retour. Dans ce cas, on ignore l'erreur et on fait un rollback.

Quelle est la méthode recommandée ? La plus performante ?
Merci.
heffer69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/06/2008, 18h26   #2
Membre Expert
 
Avatar de scheu
 
Inscription : juin 2007
Messages : 1 497
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 1 497
Points : 1 485
Points : 1 485
Regarde la commande MERGE
__________________
La théorie, c'est quand on sait tout mais que rien ne fonctionne.
La pratique, c'est quand tout fonctionne mais que personne ne sait pourquoi.
Ici, nous avons réuni théorie et pratique : Rien ne fonctionne ... et personne ne sait pourquoi !

Réplication de base avec Postgresql : http://scheu.developpez.com/tutoriel.../log-shipping/
scheu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/06/2008, 19h02   #3
Membre confirmé
 
Inscription : août 2005
Messages : 270
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 270
Points : 294
Points : 294
Le merge est de plus une solution interessante si tu doit faire un update si la ligne existe.

Sinon, la réponse est :
tu tente l'insert, s'il plante, tu trappe l'exception.

En faisant cela, tu n'as qu'un acces SQL, si tu fait un select, puis un insert, tu as 2 acces à chaque insertion réussi.

C'est probablement un peu moins cher que le merge, mais probablement de façon négligeable.
jmguiche est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/06/2008, 23h45   #4
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 459
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 459
Points : 4 226
Points : 4 226
Pas de rollback sur un insert qui plante.
Le rollback c'est pour les insert qui passent mais qu'on n'a pas encore commités.
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2008, 10h36   #5
Membre du Club
 
Inscription : novembre 2003
Messages : 125
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : novembre 2003
Messages : 125
Points : 68
Points : 68
Merci à tous pour vos réponses!

J'avais complètement oublié le MERGE que j'avais pourtant étudié à la fac!
heffer69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2008, 10h43   #6
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 320
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 320
Points : 5 839
Points : 5 839
Citation:
Envoyé par heffer69 Voir le message
Bonjour,

Une question concernant le gestion d'une ligne existante lors d'un INSERT.
Je vois deux méthodes:
-soit faire un SELECT avant l'INSERT pour tester si la ligne existe déjà. Si c'est le cas, on ne fait pas d'INSERT.
-soit faire l'INSERT en recevant un ORA-00001 (violation de contrainte) en retour. Dans ce cas, on ignore l'erreur et on fait un rollback.

Quelle est la méthode recommandée ? La plus performante ?
Merci.
En fonction de la situation réelle la méthode la plus performante est d’éviter les doublons si possible !
Les désavantagés sont :
  • Un select plus un insert
  • Un insert qui implique l’écriture des données avant de la mise à jour de l’index – le rowid signifie un pointer vers le block des données – et seulement à ce moment la détection du doublon a lieu et donc le rollback du travail déjà fait.
Sinon en terme de performance les deux méthodes sont équivalentes.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2008, 11h03   #7
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
et pourquoi pas un

Code :
1
2
3
INSERT INTO matable (col1,col2,col3)
SELECT val1,val2,val3 FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM matable WHERE (col1,col2,col3) IN (val1,val2,val3));
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2008, 16h35   #8
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 320
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 320
Points : 5 839
Points : 5 839
Citation:
Envoyé par orafrance Voir le message
et pourquoi pas un

Code :
1
2
3
INSERT INTO matable (col1,col2,col3)
SELECT val1,val2,val3 FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM matable WHERE (col1,col2,col3) IN (val1,val2,val3));
Pourquoi pas. Mais je l’impression que cella ne change rien en terme de performance et ensuite c’est le principe du rasoir d’Occam.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2008, 17h29   #9
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
certes... c'est juste plus clair dans la lecture il me semble
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h00.


 
 
 
 
Partenaires

Hébergement Web