有没有一种方法可以轻松地/优雅从Oracle 10g中查询更新与记录值的表的多个列?
我有一个表(称之为源),其具有用于纯朴起见,2列, ID
和KEY
。
ID Key
---- ----
1 1000
2 1000
3 5000
4 1000
..
101 8000
102 9000
103 7000
104 9000
...
201 5
202 5
...
我有另一个表(称之为KeyMap
),其采用trunc(ID/100)
并使用它作为batchID
与列是用于该批次内的ID密钥映射:
trunc(ID/100) key1 key2 key3 key4 ..... key99
------------- ---- ---- ---- ----
0 1000 1000 5000 1000
1 8000 9000 7000 9000
2 5 5
将创建ID和加工批量,因此在批量处理的最后,我想调用存储过程来更新记录KeyMap
与新表Key
值与1个更新语句中使用子选择或集合提供这些键值。
这是可能的,什么是这样做的最佳/最有效的方法是什么?
我会限制我的批评说,你的表的设计是不是正常的,这是不是很漂亮,但我假设你有你的理由。 我通常是使用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>;
你可以生成一个Oracle VARRAY ,并在你的钥匙传递一个批次。 你的程序,可以遍历VARRAY和更新表。