2009-06-16 100 views
1

有沒有辦法輕鬆/優雅地更新表中的多個列,並使用Oracle 10g中的查詢的記錄值?Oracle 10g PL/SQL-選擇結果作爲更新列值

我有一個表(稱爲源),它有簡單起見,2列,IDKEY

 
trunc(ID/100) key1 key2 key3 key4 ..... key99 
------------- ---- ---- ---- ---- 
0    1000 1000 5000 1000 
1    8000 9000 7000 9000 
2     5  5    

的ID是:

 
ID  Key 
---- ---- 
1  1000 
2  1000 
3  5000 
4  1000 
.. 
101  8000 
102  9000 
103  7000 
104  9000 
... 
201   5 
202   5 
... 

我還有一個表需要trunc(ID/100)並使用它作爲一個batchID 與列是爲在該批次中的ID鍵映射(稱之爲KeyMap)創建並批量處理,所以在批處理結束時,我想調用存儲過程來更新KeyMap表中的記錄,並使用新的Key值更新1個更新語句中的記錄,並使用子選擇或集合來提供那些關鍵值。

這是可能的,什麼是最好/最有效的方法呢?

+0

我對你的問題有不好的預感。看起來你正在尋找一種優雅的方式去做一些毫無意義的事情......但也許這只是你的例子被過分簡化了。 – 2009-06-16 19:08:20

回答

8

我會限制我的批評,說你的餐桌設計不規範,並不是很漂亮,但我會假設你有你的理由。我通常使用DECODE與聚合列結合的方式進行這些「旋轉」查詢,按照我的密鑰進行分組 - 在本例中爲您的僞密鑰trunc(ID/100)。再加上使用的元組的更新語法:

UPDATE Foo 
    SET (a, b, c, d) 
     = (w, x, y, z); 

,你會得到:

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

您可以生成一個Oracle VARRAY並批量傳遞您的密鑰。你的過程可以迭代VARRAY並更新表。