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

PL/SQL Oracle Discussion :

[Oracle 10gR2] Merge ne fonctionne pas


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de dragonfly
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    464
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 464
    Par défaut [Oracle 10gR2] Merge ne fonctionne pas
    Bonjour à tous,

    J'ai un merge que voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    MERGE INTO ENV_GENX_UDA EG USING ENV_GENX_UDA EGU
            ON (EG.CODPRO='100987' AND EG.TYPE_UDA=EGU.TYPE_UDA AND EG.FLAG=EGU.FLAG)
            WHEN MATCHED THEN UPDATE SET EG.SKUD3E='DEEE4567', EG.TRAN='51'
            WHEN NOT MATCHED THEN INSERT (EG.TYPE_UDA,EG.TRAN,EG.SKUD3E,EG.POINTS,EG.CODPRO,EG.FLAG,EG.DATER,EG.DATEE)
            VALUES ('100','51','DEEE4567','','100987',' ',sysdate,sysdate);
    Ce merge est censé mettre à jour ou ajouter dans la table ENV_GENX_UDA en comparant avec cette même table en fonction des paramétres dans le 'ON'


    Actuellement la table ENV_GENX_UDA est vide et lorsque je lance le MERGE, rien n'est inséré dans cette table.
    Lorsque je met un enregistrement à la main est que je relance, il me sort une erreur de contrainte unique.
    Ma clef est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Primary_key(TYPE_UDA, FLAG, CODPRO);
    Et l'insertion se fait avec un codpro différent de celui en entrée...

    P.S : Je débute dans le MERGE , donc il se peut que cela soit une erreur con (Je précise que depuis hier je vais sur les forums pour essayer de faire un merge correct... Notamment http://www.oracle-developer.net/display.php?id=310)

    Merci d'avance.
    Dragonfly

  2. #2
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 462
    Par défaut
    Bonjour

    Votre besoin n'est pas clair.
    Comme toujours, il faut fournir vos instructions CREATE TABLE, ainsi que les commandes que vous lancez et les messages d'erreur exacts et complets.
    Bref, tout ce qu'il faut, prêt à l'emploi, pour qu'on puisse reproduire votre problème.

  3. #3
    Membre éclairé Avatar de dragonfly
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    464
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 464
    Par défaut
    Soit, la table est celle-ci :

    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
     
    CREATE TABLE ENV_GENX_UDA
    (
      TYPE_UDA  VARCHAR2(3 CHAR)                    NOT NULL,
      TRAN      VARCHAR2(2 CHAR)                    NOT NULL,
      SKUD3E    VARCHAR2(16 CHAR),
      POINTS    VARCHAR2(16 CHAR),
      CODPRO    VARCHAR2(16 CHAR)                   NOT NULL,
      FLAG      VARCHAR2(1 CHAR),
      DATER     DATE,
      DATEE     DATE
    );
     
    CREATE UNIQUE INDEX EGUDA_KEY1 ON ENV_GENX_UDA
    (TYPE_UDA, CODPRO, FLAG))
    NOPARALLEL;
     
    ALTER TABLE ENV_GENX_UDA ADD (
      CONSTRAINT EGUDA_KEY1
     PRIMARY KEY
     (TYPE_UDA, CODPRO, FLAG));
    Et le veut juste faire un insert or update sur cette table.
    Du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    INSERT INTO ENV_GENX_STK (TYPE_UDA,TRAN,SKUD3E,POINTS,CODPRO,FLAG,DATER,DATEE)
    VALUES 
    ('100','51','DEEE4567','','100987',' ',sysdate,sysdate)
    OR UPDATE SET SKUD3E='DEEE4567', TRAN='51'
    Si je ne retrouve pas les données de la clef primaire dans la table, je l'insére sinon je l'update. (C'est ce que j'essaie de faire avec le merge).

    Le probléme c'est que :
    Avec la table vide, AUCUN MESSAGE D'ERREUR, et il n'y aucune ligne qui n'est ajoutée dans ma table
    Avec 2 lignes existante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SET DEFINE OFF;
    Insert into ENV_GENX_UDA
       (TYPE_UDA, TRAN, SKUD3E, CODPRO, FLAG, DATER, DATEE)
     Values
       ('100', '51', 'DEEE4567', '23456', ' ', TO_DATE('04/30/2010 11:27:28', 'MM/DD/YYYY HH24:MI:SS'), TO_DATE('04/30/2010 11:27:28', 'MM/DD/YYYY HH24:MI:SS'));
    Insert into ENV_GENX_UDA
       (TYPE_UDA, TRAN, SKUD3E, CODPRO, FLAG, DATER, DATEE)
     Values
       ('100', '51', 'DEEE4567', '100988', ' ', TO_DATE('04/30/2010 11:28:11', 'MM/DD/YYYY HH24:MI:SS'), TO_DATE('04/30/2010 11:28:11', 'MM/DD/YYYY HH24:MI:SS'));
    COMMIT;
    J'ai cette erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ORA-00001: violation de contrainte unique (SOC1.EGUDA_KEY1)
    Quand je fais ce merge :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    MERGE INTO ENV_GENX_UDA EG USING ENV_GENX_UDA EGU
            ON (EG.CODPRO='100987' AND EG.CODPRO=EGU.CODPRO AND EG.TYPE_UDA=EGU.TYPE_UDA AND EG.FLAG=EGU.FLAG)
            WHEN MATCHED THEN UPDATE SET EG.SKUD3E='DEEE4567', EG.TRAN='51'
            WHEN NOT MATCHED THEN INSERT (EG.TYPE_UDA,EG.TRAN,EG.SKUD3E,EG.POINTS,EG.CODPRO,EG.FLAG,EG.DATER,EG.DATEE)
            VALUES ('100','51','DEEE4567','','100987',' ',sysdate,sysdate);
    Alors que l'on voit bien dans l'INSERT que la clef n'est pas violée (le codpro '100987' n'existe pas dans la table)

    Merci

  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
    Ajoutez aussi un extrait du contenu de la table ENV_GENX_UDA EGU. Pour moi votre souci est lié au fait que vous essayez d'insérer des valeurs constantes pour la partie clé de votre table.

  5. #5
    Membre éclairé Avatar de dragonfly
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    464
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 464
    Par défaut
    Les "inserts" sont plus haut (EG et EGU coorespondent à la même table)

    Ex (modifié depuis tout à l'heure):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    TYPE_UDA|TRAN|SKUD3E   |POINTS|CODPRO|FLAG|DATER              |DATEE
    10      |51  |DEEE4567 |      |10087 |i   |30/04/2010 15:07:12|30/04/2010 15:07:12
    100     |51  |DEEE457  |      |10087 |    |30/04/2010 15:00:44|30/04/2010 15:00:44
    100     |51  |DEEE457  |      |100988|    |30/04/2010 14:58:43|30/04/2010 14:58:43
    Aprés avec une requête comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    MERGE INTO ENV_GENX_UDA EG USING ENV_GENX_UDA EGU
            ON (EG.CODPRO=:codpro AND EG.CODPRO=EGU.CODPRO AND EG.TYPE_UDA=EGU.TYPE_UDA AND EG.FLAG=EGU.FLAG AND EG.TYPE_UDA=:type AND trim(EG.FLAG) is null)
            WHEN MATCHED THEN UPDATE SET EG.SKUD3E='DEEE457', EG.TRAN='51'
            WHEN NOT MATCHED THEN INSERT (TYPE_UDA,TRAN,SKUD3E,POINTS,CODPRO,FLAG,DATER,DATEE)
            VALUES (:type,'51','DEEE4567','',:codpro,:flag,sysdate,sysdate);
    En remplacant les variables, ca marche toujours pas...

    Ca a fonctionné une fois en modifiant le codpro, mais je sais pas pourquoi ca a marché la et plus maintenant

  6. #6
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 462
    Par défaut
    Vu le jeu de données, la violation de contrainte unique est tout à fait justifiée.
    Après l'insertion de vos 2 lignes, on a
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SQL>  select * from env_genx_uda;
     
    TYP TR SKUD3E           POINTS           CODPRO           F DATER    DATEE
    --- -- ---------------- ---------------- ---------------- - -------- --------
    100 51 DEEE4567                          23456              30/04/10 30/04/10
    100 51 DEEE4567                          100988             30/04/10 30/04/10
    Et votre MERGE dit ensuite : pour chacune de ces 2 lignes, si je ne trouve pas de correspondance sur les critères (CODPRO + TYPE_UDA + FLAG), sachant que CODPRO doit valoir 100987, j'insère un ensemble de constantes dans la table.
    Comme aucune des 2 lignes existantes n'est conforme à l'ensemble de ces critères, vous insérez les mêmes constantes 2 fois de suite, et forcément vous violez la contrainte d'unicité.

  7. #7
    Membre éclairé Avatar de dragonfly
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    464
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 464
    Par défaut
    Merci,
    effectivement, je n'y avais pas pensé mais quand je n'ai qu'une ligne, l'insertion se fait sans probléme, mais pas quand j'en ai 2

    Le MERGE n'agit donc pas réellement comme un "INSERT OR UPDATE" alors?
    Comment faire pour que le merge travaille sur l'ensemble du tableau et non ligne par ligne?

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

Discussions similaires

  1. Mon merge ne fonctionne pas.
    Par loman02 dans le forum SQL
    Réponses: 1
    Dernier message: 17/05/2010, 14h35
  2. Oracle 10Gr2 : DBConsole ne se lance pas
    Par davy.g dans le forum Installation
    Réponses: 1
    Dernier message: 31/10/2007, 11h43
  3. Réponses: 3
    Dernier message: 06/06/2007, 18h45
  4. [Oracle DB 10G][OEM] localhost ne fonctionne pas
    Par Stessy dans le forum Oracle
    Réponses: 7
    Dernier message: 21/08/2006, 16h25
  5. Réponses: 4
    Dernier message: 26/05/2006, 08h59

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