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 :

Problème de MERGE


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2004
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 36
    Par défaut Problème de MERGE
    Je n'arrive pas à faire mon MERGE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    merge into cat_utldel
    using dual
    on (cat_utldel.SIUID = '111111111')
    when on matched then insert (SIUID) values ('111111111')
    me renvoit un ORA-00905 : Mot clé absent

    La définition de ma table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE CAT_UTLDEL
    (
      SIUID  VARCHAR2(16 BYTE)                      NOT NULL
    )
    ;
     
    CREATE UNIQUE INDEX PK_CAT_UTLDEL ON CAT_UTLDEL
    (SIUID)
    Le but est d'insérer sans doublon dans la table, et sans avoir a gérer d'exception.

    Version Oracle 9.2.0.6.0

    Merci

  2. #2
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Par défaut
    Salut,

    Voici un exemple Merge qui fonctionne. Regarde la synthaxe

    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
     
    MERGE INTO bonuses D
       USING (
    	SELECT employee_id, salary, department_id 
    	FROM employees
    	WHERE department_id = 80) S
     
       ON (D.employee_id = S.employee_id)
     
       WHEN MATCHED THEN 
    	UPDATE SET D.bonus = D.bonus + S.salary*.01
    	DELETE WHERE (S.salary > 8000)
       WHEN NOT MATCHED THEN 
    	INSERT (D.employee_id, D.bonus)
    	VALUES (S.employee_id, S.salary*0.1)
    	WHERE (S.salary <= 8000)
    ;
    Voici un site qui pourra t'aider:
    http://download-uk.oracle.com/docs/c...ments_9016.htm

  3. #3
    Membre averti
    Inscrit en
    Juillet 2004
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 36
    Par défaut
    Citation Envoyé par Flipmode
    Salut,

    Voici un exemple Merge qui fonctionne. Regarde la synthaxe
    Ben justement, en général les exemples sotn construit avec 2 tables, une à merger, et une servant dans la clause using.

    Mon but étant juste de faire un insert dans ma table, sans doublon, et sans sortir la grosse artillerie, sachant que normalement cela ne doit pas arriver.

    Je vais aller voir ton lien, merci

  4. #4
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    Citation Envoyé par cyrille_
    Je n'arrive pas à faire mon MERGE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    merge into cat_utldel
    using dual
    on (cat_utldel.SIUID = '111111111')
    when on matched then insert (SIUID) values ('111111111')
    when matched, sans le on

  5. #5
    Membre averti
    Inscrit en
    Juillet 2004
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 36
    Par défaut
    Citation Envoyé par laurentschneider
    when matched, sans le on
    Oupus, sans doute un mauvais copier/coller... C'est en fait when NOT MATCHED

    Mais l'erreur est toujours la même !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    merge into cat_utldel
    using dual
    on (cat_utldel.SIUID = '111111111')
    when NOT MATCHED then insert (SIUID) values ('111111111')
    Le but étant bien sur de remplacer ensuite le '11111111' par un paramètre.

  6. #6
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    il me semble que la partie MATCHED est obligatoire.

  7. #7
    Membre averti
    Inscrit en
    Juillet 2004
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 36
    Par défaut
    Même en revenant à une syntaxe plus classique, ca renvoit toujours cette ORA-00905 !!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    merge into cat_utldel
    using (select '111111' temp from dual) tempDual
    on (cat_utldel.SIUID = tempDual.temp)
    WHEN NOT MATCHED THEN INSERT  (SIUID) values ('111111')

  8. #8
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    le monsieur te dit qu'il manque le MATCHED


  9. #9
    Membre averti
    Inscrit en
    Juillet 2004
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 36
    Par défaut
    Citation Envoyé par orafrance
    le monsieur te dit qu'il manque le MATCHED

    J'ai déjà fait un MERGE uniquement avec un NOT MATCHED (mais en 10g)....

    Et puis ta réponse ne me va pas de toute façon, puisque je ne peux pas faire de update sur une colonne de la clause ON

  10. #10
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Par défaut Probleme de MERGE
    Citation Envoyé par cyrille_
    J'ai déjà fait un MERGE uniquement avec un NOT MATCHED (mais en 10g)....
    Je travaille sous Oracle 10 g
    J’ai essayé de faire un MERGE uniquement avec un NOT MATCHED mais ça ne marche pas ! Je m’explique :

    J’utilise un MERGE pour faire une réplication d’une base à une autre mais j’ai un problème avec ma requete ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    MERGE INTO ADM_CODECONTINENT@mo2fo TO_TABLE
    USING OKAIDI.ADM_CODECONTINENT FROM_TABLE
    ON (TO_TABLE.CODE_CONTINENT_ID=FROM_TABLE.CODE_CONTINENT_ID)
    WHEN MATCHED THEN
    UPDATE SET TO_TABLE.CODE_CONTINENT_ID=FROM_TABLE.CODE_CONTINENT_ID
    WHEN NOT MATCHED THEN
    INSERT (TO_TABLE.CODE_CONTINENT_ID)
    VALUES (FROM_TABLE.CODE_CONTINENT_ID);
    On ne peut pas modifier une colonne qui est référencé dans le ON condition!
    Donc j’ai enlevé le

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    WHEN MATCHED THEN
    UPDATE SET TO_TABLE.CODE_CONTINENT_ID=FROM_TABLE.CODE_CONTINENT_ID
    Mais en éxécutant le code ci dessous voici l’erreur que j’ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Error starting at line 1 in command:
    MERGE INTO ADM_CODECONTINENT@mo2fo TO_TABLE
    USING OKAIDI.ADM_CODECONTINENT FROM_TABLE
    ON (TO_TABLE.CODE_CONTINENT_ID=FROM_TABLE.CODE_CONTINENT_ID)
    WHEN NOT MATCHED THEN
    INSERT (TO_TABLE.CODE_CONTINENT_ID)
    VALUES (FROM_TABLE.CODE_CONTINENT_ID)
    Error at Command Line:2 Column:13
    Error report:
    SQL Error: ORA-02064: distributed operation not supported
    Je ne comprends pas ou est mon erreur

    Merci pour votre aide

    NB:
    @mo2fo est un dblink
    J’ai déjà fait plusieurs MERGE pour répliquer d’autres tables de ces 2 bases de données et tout c’est bien passé

  11. #11
    Membre averti
    Inscrit en
    Juillet 2004
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 36
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ORA-02064:	distributed operation not supported
    Cause:	One of the following unsupported operations was attempted:
    
    1. array execute of a remote update with a subquery that references a dblink, or
    
    2. an update of a long column with bind variable and an update of a second column with a subquery that both references a dblink and a bind variable, or
    
    3. a commit is issued in a coordinated session from an RPC procedure call with OUT parameters or function call.
    Action:	simplify remote update statement
    Comprends pas tout, mais bon, j'ai vu dblink

  12. #12
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    les DBLinks ne sont pas supportés dans le MERGE

  13. #13
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Par défaut
    Merci cyrille pour tes informations mais je ne comprends pas grand chose

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ORA-02064 : opération distribuée pas Cause soutenue : Une des opérations non soutenues suivantes a été essayée :
     
    1. Le tableau exécute d'une mise à jour éloignée(à distance) avec une sous-question qui fait référence à un dblink
     
    2. Une mise à jour d'une longue colonne avec la variable et une mise à jour d'une deuxième colonne avec une sous-question que les deux références un dblink et une variable se liant
     
    3. Un commit est publié à une session coordonnée d'un appel de procédure RPC avec l'appel de fonction ou des paramètres.
     
    Action : simplifiez la déclaration de mise à jour éloignée(à distance)
    Je ne pense pas que le dblink soit la cause de mon erreur.

    J’ai déjà fait plusieurs MERGE pour répliquer d’autres tables de ces 2 bases de données grace a mon dblink et tout c’est bien passé

    Je ne comprends pas pourquoi j'ai cette erreur

  14. #14
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    tu ne peux pas mettre à jour une table distante. Avant tu devais faire la mise à jour en local avec un SELECT distant, ça c'est bien autorisé

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

Discussions similaires

  1. Problème de Merge
    Par Thomad dans le forum PL/SQL
    Réponses: 4
    Dernier message: 22/07/2008, 17h55
  2. Problème avec Merge
    Par Thomad dans le forum PL/SQL
    Réponses: 1
    Dernier message: 16/07/2008, 22h11
  3. Problème Intruction MERGE
    Par ttamttam dans le forum PostgreSQL
    Réponses: 0
    Dernier message: 08/06/2008, 14h56
  4. [Utilisation] Problème de merge
    Par goetzilla dans le forum Subversion
    Réponses: 2
    Dernier message: 11/01/2008, 19h17
  5. 9i : problème avec MERGE INTO
    Par Vld44 dans le forum SQL
    Réponses: 1
    Dernier message: 16/08/2007, 11h27

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