Oracle 10g PL / SQL: selezionare i risultati come valori della colonna di aggiornamento
Domanda
Esiste un modo per aggiornare facilmente / elegantemente più colonne in una tabella con valori record da una query in Oracle 10g?
Ho una tabella (chiamala Source) che ha per semplicità, 2 colonne, ID
e KEY
.
ID Key ---- ---- 1 1000 2 1000 3 5000 4 1000 .. 101 8000 102 9000 103 7000 104 9000 ... 201 5 202 5 ...
Ho un'altra tabella (chiamala KeyMap
) che accetta trunc (ID / 100)
e la usa come batchID
con le colonne che sono una mappa chiave per gli ID all'interno del batch:
trunc(ID/100) key1 key2 key3 key4 ..... key99 ------------- ---- ---- ---- ---- 0 1000 1000 5000 1000 1 8000 9000 7000 9000 2 5 5
Gli ID vengono creati ed elaborati in batch, quindi alla conclusione dell'elaborazione batch vorrei chiamare una procedura memorizzata per aggiornare il record nella tabella KeyMap
con la nuova chiave
con 1 istruzione di aggiornamento che utilizza una sottoselezione o una raccolta che fornisce tali valori chiave.
È possibile e qual è il modo migliore / più efficiente per farlo?
Soluzione
Limiterò le mie critiche a dire che il design del tuo tavolo non è normalizzato e non è molto carino, ma suppongo che tu abbia le tue ragioni. In genere faccio queste "rotazione" interroga usando DECODE combinato con una colonna aggregata, raggruppando per la mia chiave - in questo caso, la tua pseudo-chiave, trunc (ID / 100). Combinalo con la sintassi di aggiornamento che utilizza le tuple:
UPDATE Foo
SET (a, b, c, d)
= (w, x, y, z);
e ottieni:
UPDATE KeyMap
SET
( key1
, key2
, key3
, key4
...
, key99
)
= ( SELECT MAX(decode(mod(ID, 100), 1, Key, NULL))
, MAX(decode(mod(ID, 100), 2, Key, NULL))
, MAX(decode(mod(ID, 100), 3, Key, NULL))
, MAX(decode(mod(ID, 100), 4, Key, NULL))
...
, MAX(decode(mod(ID, 100), 99, Key, NULL))
FROM Source
WHERE Trunc(Source.ID / 100) = KeyMap.batchId
GROUP BY Trunc(Source.ID / 100)
)
WHERE BatchId = <x>;
Altri suggerimenti
potresti generare un Oracle VARRAY e passare le tue chiavi in ??un batch. la tua procedura potrebbe ripetere il VARRAY e aggiornare la tabella.