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]Comment ça marche ?


Sujet :

SQL Oracle

  1. #1
    Invité
    Invité(e)
    Par défaut [Merge]Comment ça marche ?
    Bon, à force de lire ici que le MERGE est la "panacée universelle", je m'y suis mis...
    Enfin, j'ai essayé !!

    Je me trouve un peu pour le coup puisque je n'arrive pas à le maîtriser.
    J'ai regardé la documentation et j'ai fait des tests mais y a un truc qui doit m'échapper.
    Je suis sur un base 9.2.0.8.0 et je teste sous sql*plus.
    Je voudrais simplement modifier ou créer une ligne (et seulement UNE !)si l'id existe ou non.
    Hors, à chaque fois, j'impacte plusieurs lignes...

    Voici une partie de mes essais (oui, c'est un cochon mais c'est du test... )


    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
    72
    09:46:41 bdd@toto> desc j_test
     Name                         Null?    Type
     --------------------------- -------- --------------------
     ID                          NOT NULL NUMBER
     MISC                                 VARCHAR2(30)
     
    09:46:54 bdd@toto> select * from j_test;
     
            ID MISC
    ---------- ------------------------------
             0 test1
             5 test 2
     
    2 rows selected.
     
    Elapsed: 00:00:00.00
    09:47:08 bdd@toto> merge INTO J_TEST X
    09:47:38   2  USING ( SELECT id FROM J_TEST ) T
    09:47:38   3  ON ( T.id = 5 and X.id = 5 )
    09:47:38   4  when matched then UPDATE SET X.misc = 'UPDATE '||to_char(trunc(DBMS_RANDOM.VALUE(1,1000)))
    09:47:38   5  when NOT matched then insert (X.id, X.misc) 
    09:47:38   6  values ( trunc(DBMS_RANDOM.VALUE(1,1000)) , 'INSERT ' || to_char(trunc(DBMS_RANDOM.VALUE(1,1000))));
     
    2 rows merged.
     
    Elapsed: 00:00:06.05
    09:47:47 bdd@toto> select * from J_test;
     
            ID MISC
    ---------- ------------------------------
             0 test1
           518 INSERT 831
             5 UPDATE 204
     
    3 rows selected.
     
    Elapsed: 00:00:00.00
    09:48:02 bdd@toto> merge INTO J_TEST X
    09:48:28   2  USING ( SELECT id FROM J_TEST ) T
    09:48:28   3  ON ( X.id = 5 )
    09:48:28   4  when matched then UPDATE SET X.misc = 'UPDATE '||to_char(trunc(DBMS_RANDOM.VALUE(1,1000)))
    09:48:28   5  when NOT matched then insert (X.id, X.misc) 
    09:48:28   6  values ( trunc(DBMS_RANDOM.VALUE(1,1000)) , 'INSERT ' || to_char(trunc(DBMS_RANDOM.VALUE(1,1000))));
     
    merge INTO J_TEST X
    *
    ERROR at line 1:
    ORA-30926: unable to get a stable set of rows in the source tables
     
     
    Elapsed: 00:00:00.05
    09:48:30 bdd@toto> merge INTO J_TEST X
    09:48:40   2  USING ( SELECT id FROM J_TEST ) T
    09:48:40   3  ON ( T.id = 5 )
    09:48:40   4  when matched then UPDATE SET X.misc = 'UPDATE '||to_char(trunc(DBMS_RANDOM.VALUE(1,1000)))
    09:48:40   5  when NOT matched then insert (X.id, X.misc) 
    09:48:40   6  values ( trunc(DBMS_RANDOM.VALUE(1,1000)) , 'INSERT ' || to_char(trunc(DBMS_RANDOM.VALUE(1,1000))));
     
    5 rows merged.
     
    Elapsed: 00:00:00.00
    09:48:41 bdd@toto> select * from J_test ;
     
            ID MISC
    ---------- ------------------------------
             0 UPDATE 527
           518 UPDATE 583
            51 INSERT 395
             5 UPDATE 835
           669 INSERT 339
     
    5 rows selected.

    Merci de me mettre le doigt sur mon incompréhension !!

  2. #2
    Membre confirmé Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Points : 481
    Points
    481
    Par défaut
    Bonjour,
    Je ne vois pas trop où vous voulez en venir, mais si ça peut vous aider :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    MERGE INTO J_TEST X
     USING ( SELECT 5 id FROM dual ) T
     ON ( T.id = X.id)
     WHEN matched THEN UPDATE SET X.misc = 'UPDATE '||TO_CHAR(TRUNC(DBMS_RANDOM.VALUE(1,1000)))
     WHEN NOT matched THEN INSERT (X.id, X.misc) VALUES ( TRUNC(DBMS_RANDOM.VALUE(1,1000)) , 'INSERT ' || TO_CHAR(TRUNC(DBMS_RANDOM.VALUE(1,1000))));
    Je penche, donc je suis

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par chrifo Voir le message
    Bonjour,Je ne vois pas trop où vous voulez en venir, mais si ça peut vous aider
    Ben je voulais en venir justement là !
    Le champ MISC et les RANDOMS sont juste là pour visualiser ce qu'il se passe dans ma table...
    Merci beaucoup !
    Je n'avais pas bien compris la clause du USING

    Pour correspondre entièrement à ma demande initiale, c'est ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    MERGE INTO J_TEST X
     USING ( SELECT 5 id FROM dual ) T
     ON ( T.id = X.id)
     WHEN matched THEN UPDATE SET X.misc = 'UPDATE '||TO_CHAR(TRUNC(DBMS_RANDOM.VALUE(1,1000)))
     WHEN NOT matched THEN INSERT (X.id, X.misc) VALUES ( T.ID , 'INSERT ' || TO_CHAR(TRUNC(DBMS_RANDOM.VALUE(1,1000))));

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

Discussions similaires

  1. ToAsciiEx, comment cela marche ?
    Par mikyfpc dans le forum C++Builder
    Réponses: 2
    Dernier message: 17/02/2004, 21h39
  2. [MFC] list box : comment ça marche
    Par runn2 dans le forum MFC
    Réponses: 4
    Dernier message: 28/01/2004, 12h36
  3. [SYNEDIT] -> Comment ça marche ?
    Par MaTHieU_ dans le forum C++Builder
    Réponses: 2
    Dernier message: 18/01/2004, 19h11
  4. [TP][Turbo Vision] comment ça marche ??
    Par Costello dans le forum Turbo Pascal
    Réponses: 7
    Dernier message: 05/08/2003, 00h24
  5. [update][req. imbriquee] Comment ca marche ??
    Par terziann dans le forum Langage SQL
    Réponses: 3
    Dernier message: 11/07/2003, 12h51

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