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 !!