2009-06-16 3 views
1

Есть ли способ легко/элегантно обновить несколько столбцов в таблице со значениями записей из запроса в Oracle 10g?Oracle 10g PL/SQL- Выберите результаты как значения столбца обновления

У меня есть таблица (назовите ее источником), которая имеет для простоты сакэ, 2 столбца, 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 с колонкой является ключевой картой идентификаторов в пределах партии:

 
trunc(ID/100) key1 key2 key3 key4 ..... key99 
------------- ---- ---- ---- ---- 
0    1000 1000 5000 1000 
1    8000 9000 7000 9000 
2     5  5    

Идентификационных являются созданный и обработанный партиями, поэтому по завершении пакетной обработки я хотел бы вызвать хранимую процедуру для обновления записи в таблице KeyMap с новыми значениями Key с 1 оператором обновления с использованием подвыборки или коллекции, предоставляющей эти ключевые значения.

Возможно ли это, и что является лучшим/наиболее эффективным способом сделать это?

+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>; 
0

вы можете создать Oracle VARRAY и передать свои ключи в пакетном режиме. ваша процедура может перебирать VARRAY и обновлять таблицу.

Смежные вопросы