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 :
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 (select ... from tres compliqué) source on (toto.primary_key=source.primary_key) when matched then update ... when not matched then insert ...
Le principe :
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 ...
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
Partager