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 14/03/2011, 18h27   #1
Membre à l'essai
 
Inscription : septembre 2004
Messages : 26
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 26
Points : 20
Points : 20
Par défaut MERGE en erreur

Bonjour à tous,

Je fais le MERGE suivant:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
MERGE INTO table_cible alias_cible
USING (	
	  	SELECT id id_source, dt_maj dt_source, chp1 chp1_source, chp2_source
		FROM table_source
	  ) s 
ON	( s.id_source = alias_cible.id and
          s.chp1_source = to_char(alias_cible.dt_decl,'YYYYMMDD'))
WHEN MATCHED then
	 UPDATE set id = id_source
WHEN NOT MATCHED then
	INSERT (id, dt_maj, dt_decl, chp2)
	VALUES (id_source, dt_maj, to_date(chp1_source, 'YYYYMMDD'), chp2_source);
EXCEPTION
    WHEN OTHERS THEN
        err_msg := SUBSTR(SQLERRM, 1, 100)

La partie en vert ne m'intéresse pas, mais quand je supprime le WHEN MATCHED, j'ai le message d'erreur suivant:
Code :
"ORA-00905: Mot-clé absent"
Donc, je la laisse en mettant un UPDATE sur un champ, sans changer sa valeur
Mais alors, j'ai un autre message d'erreur:
Code :
"ORA-00904: "TABLE_CIBLE"."ID" : identificateur non valide"
Après recherche sur plusieurs sites, il semble que ce problème survient quand on essaie de mettre à jour la clé de la table TABLE_CIBLE, or, cette table n'a pas de clé chez moi.

Au bout du compte, ce que je cherche à faire, c'est d'insérer si la ligne n'existe pas, mais de ne rien toucher si la ligne existe.

Merci de votre aide
arsonix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2011, 19h06   #2
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
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 311
Points : 5 808
Points : 5 808
En fonction de la version d'Oracle, Merge est plus (10g) ou moins (9i) flexible.
Mais si ne voulez qu'insérer n'utilisez pas Merge! Utilisez Insert Into table cible select from table_source where not exists dans cible.
Quelle version d'Oracle utilisez vous ?
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/03/2011, 21h09   #3
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 446
Points : 10 446
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Il faudrait également la description de vos deux tables afin de vérifier qu'il n'y ait pas d'erreur, le second message indique que la colonne ID n'existe pas dans TABLE_CIBLE.

Prenez aussi l'habitude d'aliaser toutes vos colonnes, aussi bien dans les parties UPDATE qu'INSERT.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 09h22   #4
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
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 311
Points : 5 808
Points : 5 808
Citation:
Envoyé par Waldar Voir le message
Il faudrait également la description de vos deux tables afin de vérifier qu'il n'y ait pas d'erreur, le second message indique que la colonne ID n'existe pas dans TABLE_CIBLE.

...
En Oracle 9 il fait ça
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 
Connected TO Oracle9i Enterprise Edition Release 9.2.0.5.0 
Connected AS mni
 
SQL> CREATE TABLE dept1 AS SELECT * FROM hr.departments WHERE 1 = 2;
 
TABLE created
 
SQL> 
SQL> Merge INTO dept1 d
  2    USING (SELECT *
  3             FROM hr.departments
  4          ) s
  5      ON (d.department_id = s.department_id)
  6  When Matched Then UPDATE
  7    SET d.department_id = s.department_id
  8  When NOT Matched Then
  9    INSERT VALUES (s.department_id, s.department_name, s.manager_id, s.location_id)
 10  /
 
Merge INTO dept1 d
  USING (SELECT *
           FROM hr.departments
        ) s
    ON (d.department_id = s.department_id)
When Matched Then UPDATE
  SET d.department_id = s.department_id
When NOT Matched Then
  INSERT VALUES (s.department_id, s.department_name, s.manager_id, s.location_id)
 
ORA-00904: "D"."DEPARTMENT_ID" : identificateur non valide
 
SQL>
C'est devenu plus claire en 10
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 
Connected TO Oracle DATABASE 10g Enterprise Edition Release 10.2.0.4.0 
Connected AS mni
 
SQL> 
SQL> Merge INTO dept1 d
  2    USING (SELECT *
  3             FROM hr.departments
  4          ) s
  5      ON (d.department_id = s.department_id)
  6  When Matched Then UPDATE
  7    SET d.department_id = s.department_id
  8  When NOT Matched Then
  9    INSERT VALUES (s.department_id, s.department_name, s.manager_id, s.location_id)
 10  /
 
Merge INTO dept1 d
  USING (SELECT *
           FROM hr.departments
        ) s
    ON (d.department_id = s.department_id)
When Matched Then UPDATE
  SET d.department_id = s.department_id
When NOT Matched Then
  INSERT VALUES (s.department_id, s.department_name, s.manager_id, s.location_id)
 
ORA-38104: Les colonnes référencées dans la clause ON ne peuvent pas être mises à jour : "D"."DEPARTMENT_ID"
 
SQL>
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/03/2011, 10h31   #5
Membre à l'essai
 
Inscription : septembre 2004
Messages : 26
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 26
Points : 20
Points : 20
Merci à tous les 2.

En effet, il est bien plus simple de faire un INSERT WHERE NOT EXISTS, tellement simple qu'on n'y pense pas forcément

Pour info, j'étais en v9.2

Bonne journée
arsonix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 15h13   #6
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 446
Points : 10 446
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Bien vu mnitu pour la solution et la clarification du message d'erreur en 10g !
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



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


 
 
 
 
Partenaires

Hébergement Web