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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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