Oracle 10g中PL / SQL的选择结果更新列值(Oracle 10g PL/SQL- Se

2019-09-16 09:14发布

有没有一种方法可以轻松地/优雅从Oracle 10g中查询更新与记录值的表的多个列?

我有一个表(称之为源),其具有用于纯朴起见,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个更新语句中使用子选择或集合提供这些键值。

这是可能的,什么是这样做的最佳/最有效的方法是什么?

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


Answer 2:

你可以生成一个Oracle VARRAY ,并在你的钥匙传递一个批次。 你的程序,可以遍历VARRAY和更新表。



文章来源: Oracle 10g PL/SQL- Select results as update column values