IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

[Merge] Problème de chargement


Sujet :

SQL Oracle

  1. #1
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 49
    Points : 25
    Points
    25
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 49
    Points : 25
    Points
    25
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 354
    Points : 436
    Points
    436
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  4. #4
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 49
    Points : 25
    Points
    25
    Par défaut
    Merci michel,
    Mais en fait j'ai trouvé le soucis qui me posé problème !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 354
    Points : 436
    Points
    436
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  6. #6
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 49
    Points : 25
    Points
    25
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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".

  7. #7
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 49
    Points : 25
    Points
    25
    Par défaut
    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

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 354
    Points : 436
    Points
    436
    Par défaut
    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

  9. #9
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 49
    Points : 25
    Points
    25
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  10. #10
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 49
    Points : 25
    Points
    25
    Par défaut
    J'ai fait une petite erreur de le post du dessus, c'est pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ...FROM TEMP) TON (G.matr_gest = T.matr_gest)...
    Mais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !

  11. #11
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 49
    Points : 25
    Points
    25
    Par défaut
    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

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 354
    Points : 436
    Points
    436
    Par défaut
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [OC][ASE]Problème de chargement de pilote ODBC
    Par Joce dans le forum Sybase
    Réponses: 10
    Dernier message: 06/01/2006, 09h08
  2. problème de chargement dll
    Par tophque dans le forum MFC
    Réponses: 8
    Dernier message: 18/11/2005, 15h14
  3. [SQL*Loader] Problème de chargement de nombres
    Par sebduth dans le forum Oracle
    Réponses: 10
    Dernier message: 18/11/2005, 10h07
  4. [FLASH 8] Problème de chargement de swf
    Par memess dans le forum Flash
    Réponses: 3
    Dernier message: 17/11/2005, 09h41
  5. Problème de chargement de police de caractères
    Par Laurent Gomila dans le forum Windows
    Réponses: 4
    Dernier message: 19/08/2004, 16h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo