代码之家  ›  专栏  ›  技术社区  ›  RC.

Oracle 10g pl/sql-选择结果作为更新列值

  •  1
  • RC.  · 技术社区  · 15 年前

    在Oracle10g中,是否有一种方法可以使用查询中的记录值轻松/优雅地更新表中的多个列?

    我有一个表(称之为源),为了简单起见,它有两列, 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是成批创建和处理的,因此在成批处理结束时,我想调用一个存储过程来更新 键映射 新的表格 Key 值与1个update语句一起使用提供这些键值的子select或集合。

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

    2 回复  |  直到 8 年前
        1
  •  8
  •   Steve Broberg    15 年前

    我将限制我的批评,说您的表设计不是标准化的,也不是很漂亮,但我认为您有自己的理由。我通常使用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>;
    
        2
  •  0
  •   akf    15 年前

    您可以生成一个Oracle VARRAY 把你的钥匙一批一批地交进去。您的过程可以遍历varray并更新表。