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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top