Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels 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 27/02/2007, 11h24   #1
Membre actif
 
Avatar de VinceTlse
 
Inscription : janvier 2005
Messages : 163
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2005
Messages : 163
Points : 163
Points : 163
Par défaut [Merge] Pas d'insertion

Bonjour,
J'essaie pour la premiere fois de faire un MERGE.
- si je trouve l'id -> UPDATE
- si je ne le trouve pas -> INSERT

Code :
1
2
3
4
5
6
7
8
9
 
MERGE INTO SYNCHRO_DOSSIERS e
USING SYNCHRO_DOSSIERS h
ON (e.DOSSIER_ID = h.DOSSIER_ID AND h.DOSSIER_ID = 13095)
WHEN MATCHED THEN
    UPDATE SET TYPE_ETAT_SYNCHRO_ID = PACKAGE_CONSTANTES.C_TYPE_ETAT_SYNCHRO_WAITING
WHEN NOT MATCHED THEN
    INSERT (DOSSIER_ID, TYPE_ETAT_SYNCHRO_ID, SYNCHRO_DOSSIERS_COMMENT, SYNCHRO_DOSSIERS_DATE_DEM, SYNCHRO_DOSSIERS_DATE_DEB, SYNCHRO_DOSSIERS_DATE_FIN)
    VALUES (13095, PACKAGE_CONSTANTES.C_TYPE_ETAT_SYNCHRO_WAITING, NULL, SYSDATE, NULL,NULL);
Lorsque l'id existe, la mise à jour se fait sans problème.
Mais s'il n'existe pas, la ligne n'est pas insérée. (0 rows merged)

Avez vous une idée de se qui ne va pas dans ma requete?
Version: 9.2.0.7
Je vous remercie par avance!

Vincent
__________________
Pourquoi faire aujourd'hui ce que l'on peut faire demain ...
VinceTlse est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/02/2007, 12h47   #2
Membre expérimenté

 
Avatar de NGasparotto
 
Nicolas Gasparotto
Inscription : janvier 2007
Messages : 424
Détails du profil
Informations personnelles :
Nom : Nicolas Gasparotto

Informations forums :
Inscription : janvier 2007
Messages : 424
Points : 500
Points : 500
Essais de réécrire la clause USING de ton merge comme suit :
Code :
1
2
3
4
5
6
7
8
9
 
MERGE INTO SYNCHRO_DOSSIERS e
USING (SELECT * FROM SYNCHRO_DOSSIERS WHERE DOSSIER_ID = 13095) h 
ON (e.DOSSIER_ID = h.DOSSIER_ID)
WHEN MATCHED THEN
    UPDATE SET TYPE_ETAT_SYNCHRO_ID = PACKAGE_CONSTANTES.C_TYPE_ETAT_SYNCHRO_WAITING
WHEN NOT MATCHED THEN
    INSERT (DOSSIER_ID, TYPE_ETAT_SYNCHRO_ID, SYNCHRO_DOSSIERS_COMMENT, SYNCHRO_DOSSIERS_DATE_DEM, SYNCHRO_DOSSIERS_DATE_DEB, SYNCHRO_DOSSIERS_DATE_FIN)
    VALUES (13095, PACKAGE_CONSTANTES.C_TYPE_ETAT_SYNCHRO_WAITING, NULL, SYSDATE, NULL,NULL);
Nicolas.
NGasparotto est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/02/2007, 14h48   #3
Membre actif
 
Avatar de VinceTlse
 
Inscription : janvier 2005
Messages : 163
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2005
Messages : 163
Points : 163
Points : 163
Merci pour votre réponse.
Malheureusement il n'y a pas d'amélioration, l'insertion ne se fait toujours pas.
__________________
Pourquoi faire aujourd'hui ce que l'on peut faire demain ...
VinceTlse est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/02/2007, 14h55   #4
Membre expérimenté

 
Avatar de NGasparotto
 
Nicolas Gasparotto
Inscription : janvier 2007
Messages : 424
Détails du profil
Informations personnelles :
Nom : Nicolas Gasparotto

Informations forums :
Inscription : janvier 2007
Messages : 424
Points : 500
Points : 500
Est-ce possible de poster le contenu de chaque table (ou tout du moins un extrait suffisament significatif) ?

Nicolas.
NGasparotto est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/02/2007, 15h11   #5
Membre actif
 
Avatar de VinceTlse
 
Inscription : janvier 2005
Messages : 163
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2005
Messages : 163
Points : 163
Points : 163
Bien sûr!
Description de la table :
Code :
1
2
3
4
5
6
7
8
9
10
11
 
>>DESC SYNCHRO_DOSSIERS;    
 
Name                       NULL      Type         
-------------------------  --------  -------------
DOSSIER_ID                 NOT NULL  NUMBER       
TYPE_ETAT_SYNCHRO_ID       NOT NULL  NUMBER       
SYNCHRO_DOSSIERS_COMMENT             VARCHAR2(256)
SYNCHRO_DOSSIERS_DATE_DEM  NOT NULL  DATE         
SYNCHRO_DOSSIERS_DATE_DEB            DATE         
SYNCHRO_DOSSIERS_DATE_FIN            DATE
Exemples de données:
Code :
1
2
3
4
5
6
7
8
 
>>SELECT * FROM SYNCHRO_DOSSIERS;
 
DOSSIER_ID | TYPE_ETAT_SYNCHRO_ID | SYNCHRO_DOSSIERS_COMMENT |	SYNCHRO_DOSSIERS_DATE_DEM |	SYNCHRO_DOSSIERS_DATE_DEB |	SYNCHRO_DOSSIERS_DATE_FIN
-------------------------------------------------------------------------------------------------------------------------------------------------
13101      | 0	                  |	                         |  27/02/07                  |                           |
13105      | 3	                  | Toto a la plage          |  27/02/07	                | 27/02/07                  | 27/02/07
13095      | 1                    |                          |  27/02/07  	              | 27/02/07                  |
__________________
Pourquoi faire aujourd'hui ce que l'on peut faire demain ...
VinceTlse est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/02/2007, 15h14   #6
Membre expérimenté

 
Avatar de NGasparotto
 
Nicolas Gasparotto
Inscription : janvier 2007
Messages : 424
Détails du profil
Informations personnelles :
Nom : Nicolas Gasparotto

Informations forums :
Inscription : janvier 2007
Messages : 424
Points : 500
Points : 500
Ok, j'avais pas vu qu'il ne s'agissait que d'une table (et non deux).
Bon, alors essaies plutôt ceci :
Code :
1
2
3
4
5
6
7
8
MERGE INTO SYNCHRO_DOSSIERS e
USING (SELECT 13095 AS  DOSSIER_ID FROM DUAL) h 
ON (e.DOSSIER_ID = h.DOSSIER_ID)
WHEN MATCHED THEN
    UPDATE SET TYPE_ETAT_SYNCHRO_ID = PACKAGE_CONSTANTES.C_TYPE_ETAT_SYNCHRO_WAITING
WHEN NOT MATCHED THEN
    INSERT (DOSSIER_ID, TYPE_ETAT_SYNCHRO_ID, SYNCHRO_DOSSIERS_COMMENT, SYNCHRO_DOSSIERS_DATE_DEM, SYNCHRO_DOSSIERS_DATE_DEB, SYNCHRO_DOSSIERS_DATE_FIN)
    VALUES (h.DOSSIER_ID, PACKAGE_CONSTANTES.C_TYPE_ETAT_SYNCHRO_WAITING, NULL, SYSDATE, NULL,NULL);
Nicolas.
NGasparotto est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/02/2007, 15h30   #7
Membre actif
 
Avatar de VinceTlse
 
Inscription : janvier 2005
Messages : 163
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2005
Messages : 163
Points : 163
Points : 163
Merci NGasparotto,

Ta solution marche à merveille.
Par contre je n'ai pas très bien compris la cause. Si tu as le temps, je veux bien une toute petite explication.
Sinon, tu ne serais pas de C-S Tlse? Ton nom me dit quelque chose.
Merci beaucoup pour ton aide.

Vincent
__________________
Pourquoi faire aujourd'hui ce que l'on peut faire demain ...
VinceTlse est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/02/2007, 15h49   #8
Membre expérimenté

 
Avatar de NGasparotto
 
Nicolas Gasparotto
Inscription : janvier 2007
Messages : 424
Détails du profil
Informations personnelles :
Nom : Nicolas Gasparotto

Informations forums :
Inscription : janvier 2007
Messages : 424
Points : 500
Points : 500
Bien, on va essayer une petite explication.

MERGE INTO
Tu merge dans une table dans laquelle il n'y a priori pas ta ligne 13095, ok ?

USING
Tu utilise une table (la même en l'occurence) en restreignant sur la ligne 13095.
* Si cette ligne existe ici, elle existe aussi dans la table dans laquelle tu merge (puisque la table est la même), donc la jointure est vérifiée, donc tu rentres dans WHEN MATCHED et l'update.
* Si cette ligne n'existe pas dans ta deuxième, elle n'existe pas non plus dans dans la première table (puisque ta première table - celle du MERGE INTO - est la même), donc ni dans l'une ni dans l'autre... donc pas de jointure du tout.

Pour pouvoir merger, autrement dit pour effectuer une jointure - ta clause ON -, il te faut au moins une ligne pour pouvoir dire qu'elle est de l'autre côté ou non, non ?
D'où, dans ton cas précis, l'utilisation de la table DUAL qui te renverra de toute façon la ligne 13095, et regardes si elle est ou non dans ta table dans laquelle tu fais le merge.

Sinon, oui CS Toulouse...

Nicolas.
NGasparotto 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 18h26.


 
 
 
 
Partenaires

Hébergement Web