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 28/01/2008, 09h24   #1
Candidat au titre de Membre du Club
 
Inscription : janvier 2008
Messages : 49
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 49
Points : 11
Points : 11
Par défaut [Merge] Problème de chargement

Bonjour,
En fait j'ai deux tables avec tous les champs identiques : une table temporaire et une table principale et j'aimerais fais une mise à jour entre ces deux tables.
Donc j'ai trouvé la fonction merge qui correspond parfaitement à mon besoin. Pour l'instant tout va bien sauf qu'à l'éxécution de cette fonction, elle fait seulement une insertion dans ma table principale et non une mise à jour !
La fonction Merge va rechercher les matricules semblables et s'il yen a, une mise a jour devrait etre faite sinon une insertion est faite.

Code :
1
2
3
4
5
6
7
 
MERGE INTO GESTOR G
   USING (SELECT matr_gest,nom_gest,prenom_gest,secteur_gest,code_gest,secteur1_gest,codeSecteur_gest,codeInc_gest,codeID_gest,codeNom_gest,dateEmbauche_gest FROM TEMP) T
   ON (G.matr_gest = T.matr_gest)
   WHEN MATCHED THEN UPDATE SET G.nom_gest = T.nom_gest,G.prenom_gest = T.prenom_gest,G.secteur_gest = T.secteur_gest,G.code_gest = T.code_gest,G.secteur1_gest = T.secteur1_gest,G.codeSecteur_gest = T.codeSecteur_gest,G.codeInc_gest = T.codeInc_gest,G.codeID_gest = T.codeID_gest,G.codeNom_gest = T.codeNom_gest,G.dateEmbauche_gest = T.dateEmbauche_gest
   WHEN NOT MATCHED THEN INSERT(G.matr_gest,G.nom_gest,G.prenom_gest,G.secteur_gest,G.code_gest,G.secteur1_gest,G.codeSecteur_gest,G.codeInc_gest,G.codeID_gest,G.codeNom_gest,G.dateEmbauche_gest)
   VALUES (T.matr_gest,T.nom_gest,T.prenom_gest,T.secteur_gest,T.code_gest,T.secteur1_gest,T.codeSecteur_gest,T.codeInc_gest,T.codeID_gest,T.codeNom_gest,T.dateEmbauche_gest);
Je pense avoir respecté la syntaxe vue que je n'est pas d'erreur qui s'affiche mais je ne vois pas d'ou le problème peut venir.
J'aimeras avoir un conseil ou une épaule sur laquelle pleurer
ttamttam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2008, 11h15   #2
Candidat au titre de Membre du Club
 
Inscription : janvier 2008
Messages : 49
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 49
Points : 11
Points : 11
Code :
1
2
 
ON (G.matr_gest <> T.matr_gest)
Ai-je le droit de faire ca ?
et donc après d'inverser mon upadte et mon insert.
ttamttam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2008, 15h50   #3
Membre éprouvé
 
Inscription : décembre 2007
Messages : 354
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 354
Points : 408
Points : 408
D'abord éviter les lignes longues rend le code SQL plus lisible et plus comréhensible ...

Puisque les deux tables ont la même strucuture alors on peut faire simplement:
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
34
35
36
37
38
39
40
41
42
MERGE INTO GESTOR G
   USING TEMP T
   ON (G.matr_gest = T.matr_gest)
   WHEN MATCHED THEN UPDATE SET
     G.nom_gest = T.nom_gest,
     G.prenom_gest = T.prenom_gest,
     G.secteur_gest = T.secteur_gest,
     G.code_gest = T.code_gest,
     G.secteur1_gest = T.secteur1_gest,
     G.codeSecteur_gest = T.codeSecteur_gest,
     G.codeInc_gest = T.codeInc_gest,
     G.codeID_gest = T.codeID_gest,
     G.codeNom_gest = T.codeNom_gest,
     G.dateEmbauche_gest = T.dateEmbauche_gest
   WHEN NOT MATCHED THEN INSERT
   (
     G.matr_gest,
     G.nom_gest,
     G.prenom_gest,
     G.secteur_gest,
     G.code_gest,
     G.secteur1_gest,
     G.codeSecteur_gest,
     G.codeInc_gest,
     G.codeID_gest,
     G.codeNom_gest,
     G.dateEmbauche_gest
   )
   VALUES
   (
     T.matr_gest,
     T.nom_gest,
     T.prenom_gest,
     T.secteur_gest,
     T.code_gest,
     T.secteur1_gest,
     T.codeSecteur_gest,
     T.codeInc_gest,
     T.codeID_gest,
     T.codeNom_gest,
     T.dateEmbauche_gest
   );
La syntaxe semble correcte mais concernant le vocabulaire : MERGE n'est pas une fonction mais une instruction SQL. Si des mises à jour ne sont pas constatées alors ça veut dire que des lignes "communes" n'existent pas entre les deux tables.
__________________
Consultant et formateur Oracle
Michel SALAIS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2008, 16h31   #4
Candidat au titre de Membre du Club
 
Inscription : janvier 2008
Messages : 49
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 49
Points : 11
Points : 11
Merci michel,
Mais en fait j'ai trouvé le soucis qui me posé problème !
Code :
1
2
 
ON (T.matr_gest = G.matr_gest)
J'ai inversé le le "T" et le "G" et ca a résolu mon problème car en fait avant je comparais celui de ma table principale a celui de ma table temporaire alors qu'il fallait que je fasse l'inverse.
Encore une erreur bète qui m'a pris 3h à la résoudre !!!!!! pfff
Meric encore pour ta réponse !
Bonne continuation
ttamttam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2008, 17h55   #5
Membre éprouvé
 
Inscription : décembre 2007
Messages : 354
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 354
Points : 408
Points : 408
Non ce n'est certainement pas le problème!
La place des colonnes autour de l'égalité n'a aucune importance

Un exemple qui le prouve:
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
SET echo ON
 
SELECT *
FROM emp1
 
EMPNO                  ENAME      JOB       MGR                    HIREDATE                  SAL                    COMM                   DEPTNO                 
---------------------- ---------- --------- ---------------------- ------------------------- ---------------------- ---------------------- ---------------------- 
7369                   SMITH      CLERK     7902                   17/12/1980 00:00:00       3676                                          20                     
7499                   ALLEN      SALESMAN  7698                   20/02/1981 00:00:00       7351,98                300                    30                     
7521                   WARD       SALESMAN  7698                   22/02/1981 00:00:00       5743,72                500                    30                     
7566                   JONES      MANAGER   7839                   02/04/1981 00:00:00       13670,05                                      20                     
 
4 rows selected
 
SELECT *
FROM emp
 
EMPNO                  ENAME      JOB       MGR                    HIREDATE                  SAL                    COMM                   DEPTNO                 
---------------------- ---------- --------- ---------------------- ------------------------- ---------------------- ---------------------- ---------------------- 
7369                   SMITH      CLERK     7902                   17/12/1980 00:00:00       3676                                          20                     
7499                   ALLEN      SALESMAN  7698                   20/02/1981 00:00:00       7351,98                300                    30                     
7521                   WARD       SALESMAN  7698                   22/02/1981 00:00:00       5743,72                500                    30                     
7566                   JONES      MANAGER   7839                   02/04/1981 00:00:00       13670,05                                      20                     
7654                   MARTIN     SALESMAN  7698                   28/09/1981 00:00:00       5743,72                1400                   30                     
7698                   BLAKE      MANAGER   7839                   01/05/1981 00:00:00       13095,73                                      30                     
7782                   CLARK      MANAGER   7839                   09/06/1981 00:00:00       11257,73                                      10                     
7788                   SCOTT      ANALYST   7566                   19/04/1987 00:00:00       13784,94                                      20                     
7839                   KING       PRESIDENT                        17/11/1981 00:00:00       22974,9                                       10                     
7844                   TURNER     SALESMAN  7698                   08/09/1981 00:00:00       6892,49                0                      30                     
7876                   ADAMS      CLERK     7788                   23/05/1987 00:00:00       5054,49                                       20                     
7900                   JAMES      CLERK     7698                   03/12/1981 00:00:00       4365,26                                       30                     
7902                   FORD       ANALYST   7566                   03/12/1981 00:00:00       13784,94                                      20                     
7934                   MILLER     CLERK     7782                   23/01/1982 00:00:00       5973,48                                       10                     
 
14 rows selected
 
UPDATE emp
SET sal = sal * 2
 
14 rows updated
merge INTO emp1 e1
USING emp e
ON (e.empno = e1.empno)
when matched then
UPDATE
SET e1.sal =  e.sal
when NOT matched then
INSERT (e1.empno, e1.ename, e1.job, e1.mgr, e1.hiredate, e1.sal, e1.comm, e1.deptno)
VALUES (e.empno, e.ename, e.job, e.mgr, e.hiredate, e.sal, e.comm, e.deptno)
 
14 rows merged
SELECT * FROM emp1
 
EMPNO                  ENAME      JOB       MGR                    HIREDATE                  SAL                    COMM                   DEPTNO                 
---------------------- ---------- --------- ---------------------- ------------------------- ---------------------- ---------------------- ---------------------- 
7369                   SMITH      CLERK     7902                   17/12/1980 00:00:00       7352                                          20                     
7499                   ALLEN      SALESMAN  7698                   20/02/1981 00:00:00       14703,96               300                    30                     
7521                   WARD       SALESMAN  7698                   22/02/1981 00:00:00       11487,44               500                    30                     
7566                   JONES      MANAGER   7839                   02/04/1981 00:00:00       27340,1                                       20                     
7844                   TURNER     SALESMAN  7698                   08/09/1981 00:00:00       13784,98               0                      30                     
7839                   KING       PRESIDENT                        17/11/1981 00:00:00       45949,8                                       10                     
7782                   CLARK      MANAGER   7839                   09/06/1981 00:00:00       22515,46                                      10                     
7654                   MARTIN     SALESMAN  7698                   28/09/1981 00:00:00       11487,44               1400                   30                     
7788                   SCOTT      ANALYST   7566                   19/04/1987 00:00:00       27569,88                                      20                     
7698                   BLAKE      MANAGER   7839                   01/05/1981 00:00:00       26191,46                                      30                     
7934                   MILLER     CLERK     7782                   23/01/1982 00:00:00       11946,96                                      10                     
7902                   FORD       ANALYST   7566                   03/12/1981 00:00:00       27569,88                                      20                     
7876                   ADAMS      CLERK     7788                   23/05/1987 00:00:00       10108,98                                      20                     
7900                   JAMES      CLERK     7698                   03/12/1981 00:00:00       8730,52                                       30                     
 
14 rows selected
__________________
Consultant et formateur Oracle
Michel SALAIS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2008, 09h09   #6
Candidat au titre de Membre du Club
 
Inscription : janvier 2008
Messages : 49
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 49
Points : 11
Points : 11
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
34
35
36
37
38
39
40
41
42
43
44
 
MERGE INTO GESTOR G
   USING TEMP T
   ON (T.matr_gest = G.matr_gest)
   WHEN MATCHED THEN UPDATE SET 
		G.nom_gest = T.nom_gest,
		G.prenom_gest = T.prenom_gest,
		G.secteur_gest = T.secteur_gest,
		G.code_gest = T.code_gest,
		G.secteur1_gest = T.secteur1_gest,
		G.codeSecteur_gest = T.codeSecteur_gest,
		G.codeInc_gest = T.codeInc_gest,
		G.codeID_gest = T.codeID_gest,
		G.codeNom_gest = T.codeNom_gest,
		G.dateEmbauche_gest = T.dateEmbauche_gest
   WHEN NOT MATCHED THEN 
		INSERT
		(
			G.matr_gest,
			G.nom_gest,
			G.prenom_gest,
			G.secteur_gest,
			G.code_gest,
			G.secteur1_gest,
			G.codeSecteur_gest,
			G.codeInc_gest,
			G.codeID_gest,
			G.codeNom_gest,
			G.dateEmbauche_gest
		)
		VALUES 
		(
			T.matr_gest,
			T.nom_gest,
			T.prenom_gest,
			T.secteur_gest,
			T.code_gest,
			T.secteur1_gest,
			T.codeSecteur_gest,
			T.codeInc_gest,
			T.codeID_gest,
			T.codeNom_gest,
			T.dateEmbauche_gest
		);
Comparé à l'autre code, je n'ai rien changé à part l'inversion des colonnes de "ON" et l'éclaircissement de mon code sinon rien à changé. Et pourtant mon code fonctionne comme il se doit. J'ai testé l'insertion et l'update et tout fonctionne. C'est donc pour cela que je me suis dis que mon erreur venait de mon égalité autour du "ON".
ttamttam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2008, 10h58   #7
Candidat au titre de Membre du Club
 
Inscription : janvier 2008
Messages : 49
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 49
Points : 11
Points : 11
Je viens de rerevérifier mon instruction SQL [merge] et tout fonctionne donc je ne sais pas ce qui as fait que dorénavant elle fonctionne.
Donc si quelqu'un trouve une explication qu'il en fasse part car personnellement je ne vois vraiment pas du tout d'ou ca peut venir.
Peut-être ma clause d'égalité "ON".
Merci
ttamttam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2008, 11h10   #8
Membre éprouvé
 
Inscription : décembre 2007
Messages : 354
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 354
Points : 408
Points : 408
La seule chose à laquelle je peut penser c'est que la table temporaire ne contenait pas les bonnes données lors du premier essai ...
__________________
Consultant et formateur Oracle
Michel SALAIS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2008, 09h20   #9
Candidat au titre de Membre du Club
 
Inscription : janvier 2008
Messages : 49
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 49
Points : 11
Points : 11
J'ai toujours un soucis avec mon instruction MERGE car quand je l'éxécute dans l'éxécuteur de requète Oracle tout fonctionne correctement, des modifications ou insertions se font comme prévues.
Mais lorsque je l'éxécute dans mon aplli sous cette forme :
Code :
1
2
 
MERGE INTO GESTOR G USING (SELECT matr_gest, nom_gest, prenom_gest, secteur_gest, code_gest, groupe_gest, secteur1_gest, codeSecteur_gest, codeInc_gest, codeID_gest, codeNom_gest, dateEmbauche_gest FROM TEMP) TON (G.matr_gest = T.matr_gest) WHEN MATCHED THEN UPDATE SET G.nom_gest = T.nom_gest,G.prenom_gest = T.prenom_gest,G.secteur_gest = T.secteur_gest,G.code_gest = T.code_gest,G.secteur1_gest = T.secteur1_gest,G.codeSecteur_gest = T.codeSecteur_gest,G.codeInc_gest = T.codeInc_gest,G.codeID_gest = T.codeID_gest,G.codeNom_gest = T.codeNom_gest,G.dateEmbauche_gest = T.dateEmbauche_gest WHEN NOT MATCHED THEN INSERT(G.matr_gest,G.nom_gest,G.prenom_gest,G.secteur_gest,G.code_gest,G.secteur1_gest,G.codeSecteur_gest,G.codeInc_gest,G.codeID_gest,G.codeNom_gest,G.dateEmbauche_gest)VALUES (T.matr_gest,T.nom_gest,T.prenom_gest,T.secteur_gest,T.code_gest,T.secteur1_gest,T.codeSecteur_gest,T.codeInc_gest,T.codeID_gest,T.codeNom_gest,T.dateEmbauche_gest);
Je suis obligé de mettre toute mon instruction sur la meme ligne sinon VisulaStudio me trouve des erreurs.
A l'éxécution tout se passe bien sauf qu'il fait une insertion quoiqu'il arrive.
J'ai donc pensé que mon erreur pourrait etre venir du fait de tout mettre sur la meme ligne.
ttamttam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2008, 09h35   #10
Candidat au titre de Membre du Club
 
Inscription : janvier 2008
Messages : 49
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 49
Points : 11
Points : 11
J'ai fait une petite erreur de le post du dessus, c'est pas :
Code :
1
2
 
...FROM TEMP) TON (G.matr_gest = T.matr_gest)...
Mais :
Code :
1
2
 
...FROM TEMP) T ON (G.matr_gest = T.matr_gest)...
J'avais modifé mon code à l'éxécution donc le problème est toujorus le meme !
ttamttam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2008, 10h53   #11
Candidat au titre de Membre du Club
 
Inscription : janvier 2008
Messages : 49
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 49
Points : 11
Points : 11
Vous allez me prenre pour un gland mais en fait je viens de trouver la source de tous mes soucis, et elle vient pas du tout de mon instruction MERGE. Elle vient des données de ma table temporaire, car en fait je fais une insertion dans cette table grace à un SQL LOADER. Cette commande requiert un fichier à insérer un fichier de log et un fichier de controle.
L'éxécution coince au niveau du chargement des données dans ma table temporaire, tout est décalé, autrement dit : j'ai rien dans mon champ matricule et je retrouve mon matricule dans le champ d'à coté et ainsi de suite. Donc mon merge cherchait à comparer deux matricules ou il n'y avait rien à chaque fois donc forcément il est inséré tout le temps.
Maintenant je dois me pencher sur ce problème de chargement de données.
En tout cas merci à tous pour m'avoir aidé dans mon problème initial
ttamttam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2008, 18h11   #12
Membre éprouvé
 
Inscription : décembre 2007
Messages : 354
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 354
Points : 408
Points : 408
Citation:
Envoyé par Michel SALAIS Voir le message
La seule chose à laquelle je peut penser c'est que la table temporaire ne contenait pas les bonnes données lors du premier essai ...
Donc ça rejoints ce que je pensais ...

Il faut savoir aussi que les données d'une table globale temporaire (si la table est définie ainsi) ne sont pas visibles par une autre session que celle qui les a insérées.
__________________
Consultant et formateur Oracle
Michel SALAIS 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 12h38.


 
 
 
 
Partenaires

Hébergement Web