Oracle 10g PL / SQL-选择结果作为更新列值

时间:2009-06-16 18:00:25

标签: sql oracle plsql oracle10g

有没有办法轻松/优雅地更新表中包含Oracle 10g中查询记录值的多个列?

我有一张表(称之为Source),其中包含2个列,IDKEY

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使用提供这些键值的子选择或集合的更新语句。

这是可能的吗?最好/最有效的方法是什么?

2 个答案:

答案 0 :(得分: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>;

答案 1 :(得分:0)

您可以生成Oracle VARRAY并批量传入密钥。您的过程可以迭代VARRAY并更新表。