首页 文章

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

提问于
浏览
1

有没有办法轻松/优雅地更新表中的多个列,其中包含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是分批创建和处理的,因此在批处理结束时,我想调用一个存储过程来使用子选择或集合提供新的 Key 值和1更新语句来更新 KeyMap 表中的记录 . 那些关键 Value 观 .

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

2 回答

  • 0

    我会批评我的批评,说你的桌面设计没有正常化,并且不是很漂亮,但我会假设你有理由 . 我通常使用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>;
    
  • 8

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

相关问题