2010-11-24 15 views
1

Dans Oracle, j'utilise une instruction MERGE comme:Can MERGE mise à jour sur les deux tables?

merge into live_table l 
using (
    select * 
    from staging_table 
    where merged = 'N' 
) s 
on (i.id = s.id) 
when matched then 
    update l.description = s.description 
when not matched then 
    insert (l.id, l.description) 
    values (s.id, s.description) 
; 

La table de mise en scène contient également une « fusion » drapeau, que je veux mettre à jour « Y » après la fusion.

Je pensais que je pouvais combiner cela avec une mise à jour supplémentaire (après la fusion) comme:

update staging_table 
set merged = 'Y' 
where id in (select id 
    from live_table) 
; 

mais met également à jour le drapeau sur les dossiers qui ont déjà été fusionnées dans les transactions précédentes. Une solution de contournement consiste à écrire cela sous la forme d'une boucle qui gère l'insertion/mises à jour une par une, mais cela annulerait la facilité de l'instruction MERGE.

Comment puis-je mettre à jour l'indicateur fusionné de telle sorte que je suis sûr que seules les lignes affectées par l'instruction de fusion sont mises à jour?

Répondre

3

Dans ce cas, j'utiliserais un bloc PL/SQL, et j'utiliserais bulk bind + bulk binds pour faire les requêtes et les mises à jour/insertions nécessaires.

+0

Déjà pensé. Merci de confirmer! –