2010-11-24 8 views
1

In Oracle, verwende ich eine MERGE-Anweisung wie:Kann MERGE Update auf beiden Tabellen?

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) 
; 

Die Staging-Tabelle enthält auch eine „verschmolzen“ Flagge, die ich nach der Zusammenführung auf ‚Y‘ aktualisieren möchten.

ich dachte ich, das mit einem zusätzlichen Update (nach der Zusammenführung) wie kombinieren könnte:

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

aber aktualisiert auch die Flagge auf Datensätze, die bereits in früheren Transaktionen zusammengeführt wurden. Eine Problemumgehung besteht darin, dies als eine Schleife zu schreiben, die die Einfügungen/Aktualisierungen einzeln behandelt, aber das würde die Leichtigkeit der MERGE-Anweisung besiegen.

Wie kann ich das zusammengefügte Flag so aktualisieren, dass ich sicher bin, dass nur die Zeilen aktualisiert werden, die von der Merge-Anweisung betroffen sind?

Antwort

3

In diesem Fall würde ich einen PL/SQL-Block verwenden und Bulk Collect + Bulk-Bindungen verwenden, um die erforderlichen Abfragen und Updates/Inserts durchzuführen.

+0

Schon gedacht. Danke für die Bestätigung! –

Verwandte Themen