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

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2004
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 36
    Points : 24
    Points
    24
    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 du Club
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Points : 60
    Points
    60
    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 à l'essai
    Inscrit en
    Juillet 2004
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 36
    Points : 24
    Points
    24
    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
    Points : 4 926
    Points
    4 926
    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 à l'essai
    Inscrit en
    Juillet 2004
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 36
    Points : 24
    Points
    24
    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 sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

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

  7. #7
    Membre à l'essai
    Inscrit en
    Juillet 2004
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 36
    Points : 24
    Points
    24
    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 sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

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


  9. #9
    Membre à l'essai
    Inscrit en
    Juillet 2004
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 36
    Points : 24
    Points
    24
    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
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    avant la 10g c'est obligatoire

    Dans ton cas le MERGE n'est de toute façon pas adapté . Tu devrais faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO cat_utldel (SIUID) 
    SELECT '111111111' FROM dual
    WHERE NOT EXISTS (SELECT 1 FROM cat_utldel WHERE cat_utldel.SIUID = '111111111'
    Sinon, les PK c'est bien sinon

  11. #11
    Membre à l'essai
    Inscrit en
    Juillet 2004
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 36
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par orafrance
    avant la 10g c'est obligatoire
    Ah ben vu comme ca, c'est moins pratique !

    Citation Envoyé par orafrance
    Dans ton cas le MERGE n'est de toute façon pas adapté .
    Conceptuellement, j'aimais bien...

    Citation Envoyé par orafrance
    Tu devrais faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO cat_utldel (SIUID) 
    SELECT '111111111' FROM dual
    WHERE NOT EXISTS (SELECT 1 FROM cat_utldel WHERE cat_utldel.SIUID = '111111111'
    Sinon, les PK c'est bien sinon
    Ca marche nickel, merci

  12. #12
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Points : 60
    Points
    60
    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é

  13. #13
    Membre à l'essai
    Inscrit en
    Juillet 2004
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 36
    Points : 24
    Points
    24
    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

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

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

  15. #15
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Points : 60
    Points
    60
    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

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    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é

  17. #17
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Points : 60
    Points
    60
    Par défaut
    Citation Envoyé par orafrance
    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é
    Je comprends ce que tu veux dire mais je ne vois pas ce que je dois modifier dans ma requete pour qu'elle fonctionne ?

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    tu ne fais pas de MERGE mais une procédure qui update la table distante et fait une insertion si SQL%ROWCOUNT=0 (c'est à dire aucun update donc que la ligne n'existe pas)... à l'ancienne quoi

  19. #19
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Points : 60
    Points
    60
    Par défaut
    Citation Envoyé par orafrance
    tu ne fais pas de MERGE mais une procédure qui update la table distante et fait une insertion si SQL%ROWCOUNT=0 (c'est à dire aucun update donc que la ligne n'existe pas)... à l'ancienne quoi
    Ok je n'utiliserais pas de MERGE! Cependant ma table distante est vide donc SQL%ROWCOUNTsera forcément égal à 0. Je ne vais faire aucune modification dans ma table distante, je dois juste faire des insertions.

    Donc d'apres ce que je viens de dire et ce que tu as dit précèdemment, ma requete sera un INSERT INTO? car je suis jeune et les choses à l'ancienne je ne maitrise pas trop

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    bah oui... si tu veux faire un INSERT tu tapes la commande INSERT, si tu veux faire un UPDATE ce sera UPDATE et si c'est l'un ou l'autre selon que la ligne existe ou pas ce sera MERGE... à chaque besoin sa commande

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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