1

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

我有一个表(称为 Source),为了简单起见,它有 2 列 IDKEY.

身份证钥匙
---- ----
1 1000
2 1000
3 5000
4 1000
..
101 8000
102 9000
103 7000
104 9000
...
201 5
202 5
...

我有另一个表(称为它KeyMap)将trunc(ID/100)其用作 a 并将其用作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 个更新语句使用提供这些键的子选择或集合价值观。

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

4

2 回答 2

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>;
于 2009-06-16T19:33:07.763 回答
0

您可以生成一个 Oracle VARRAY并批量传递您的密钥。您的过程可以遍历 VARRAY 并更新表。

于 2009-06-16T19:01:43.447 回答