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

Oracle Discussion :

MERGE en erreur


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Septembre 2004
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 38
    Par défaut MERGE en erreur
    Bonjour à tous,

    Je fais le MERGE suivant:

    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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    "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 : Sélectionner tout - Visualiser dans une fenêtre à part
    "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

  2. #2
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Par défaut
    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 ?

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    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.

  4. #4
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Par défaut
    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 : 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
     
    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 : 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
     
    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>

  5. #5
    Membre averti
    Inscrit en
    Septembre 2004
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 38
    Par défaut
    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

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Bien vu mnitu pour la solution et la clarification du message d'erreur en 10g !

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

Discussions similaires

  1. Merge et erreur TF14085
    Par lutecefalco dans le forum Visual Studio Team System
    Réponses: 0
    Dernier message: 14/10/2011, 14h26
  2. [TortoiseSVN] erreur lors d'un merge
    Par fayred dans le forum Subversion
    Réponses: 1
    Dernier message: 23/11/2009, 11h59
  3. [Utilisation] Erreur lors du merge
    Par FranckRav dans le forum Subversion
    Réponses: 1
    Dernier message: 28/05/2009, 12h25
  4. [TortoiseSVN] Erreur d'utilisation de la fonction merge
    Par Mathieu.Nanoux dans le forum Subversion
    Réponses: 4
    Dernier message: 08/08/2008, 11h10
  5. MERGE - Pousuivre malgré une erreure
    Par ArCal dans le forum SQL
    Réponses: 3
    Dernier message: 17/01/2008, 18h12

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