[Oracle 92]Merge - ora-600
J'ai été confronté à un bug Oracle lors d'un merge avec une requête complexe dans le using. Lors du parse (ça plante aussi bien en explain plan qu'en execute), j'ai une erreur ora-600 [qkaUpsertRowVec1].
Il y a des bugs référencé présent sur metalink, mais sans aucune solution.
J'ai malgré tout réussi à trouver un contournement.
Voici la version qui plante :
Code:
1 2 3 4 5 6 7 8
|
merge into toto
using (select ... from tres compliqué) source
on (toto.primary_key=source.primary_key)
when matched then
update ...
when not matched then
insert ... |
Si je modifie comme suit, ça marche :
Code:
1 2 3 4 5 6 7 8
|
merge into toto
using ( with temp as (select /*+ MATERIALIZE */ ... from tres compliqué) select * from temp) source
on (toto.primary_key=source.primary_key)
when matched then
update ...
when not matched then
insert ... |
Le principe :
je transforme la requête complexe en requête trés simple et je remonte la complexité dans un with que je matérialise sur le temp. D'ou l'importance du hint materialize (attention : non documenté, donc certains clients peuvent refuser).
Une autre solution, plus lourde mais sans le hint non documenté : créer une global temporary table, faire un insert select dedans et n'avoir qu'un select * from la_table_temporaire.
bon week
Hugues