2017-02-02 5 views
-1

Я работаю над хранимой процедурой Oracle. Я запускаю запрос, в котором я создаю разделы и создаю новый столбец с числовым значением. Мне нужно сохранить этот результат где-нибудь и использовать его в качестве источника, когда я обновляю свою оригинальную таблицу. Что-то вроде этого:Сохранять результаты запроса в некоторой структуре, а затем обновлять некоторую таблицу при извлечении строк из temp reultset

выберите х, у, .. из TABLEA (ROWNUM() над partiton по й) new_col где ... (перечень условий) .... условия цикла TABLEA обновления где new_col = (некоторое числовое значение цикла var) ...

Я попытался использовать курсор и объем, собирающий вывод первого запроса в переменную, но когда я запустил цикл, мне придется разобрать по одной строке курсора , Я не хочу этого ... Я хочу, чтобы обновление запускалось в нескольких строках в исходной таблице. Это возможно, если я просто запускаю свой запрос на обновление в цикле, но условия, в которых условия и вычисления нового столбца на каждой итерации кажутся неэффективными.

Без создания временного стола .. это возможно? Может кто-то, пожалуйста, помогите мне с этим

+0

Не могли бы вы показать нам, что вы пробовали? –

+0

Зачем вам «хранить» результаты где-то? Почему вы не можете делать все ** в одном заявлении? Зачем вам нужна процедура для этого (хранится или иным образом)? Вы должны быть в состоянии сделать все в простом SQL - это почти наверняка будет намного более эффективным, чем все, что вы можете сделать в процедуре. – mathguy

+0

Хранилище хранится в некоторых других функциях. Если один оператор запускается в каждой итерации, не будет очень эффективным – sak

ответ

0

Поскольку вопрос немного неоднозначный, я попытался воспроизвести ваш сценарий. Надеюсь это поможет. MERGE может хватить вашей проблемы, как показано на рисунке.

MERGE INTO TABLEA USING 
(SELECT X,Y, ROW_NUMBER() OVER(PARTITION BY X ORDER BY 1 DESC) NEW_COL FROM TABLEB)b 
ON 
(tableA.col1 = tableB.col1) 
WHEN MATCHED THEN 
UPDATE 
SET NEW_COL = b.NEW_COL; 
+0

Спасибо, но я тоже использовал слияние. Но дело в том, что я должен зацикливаться до тех пор, пока условие не станет ложным. А инструкция обновления зависит от конкретной итерации. Я хочу избежать этой части цикла, которая может быть рассчитана ранее и сохранена. Например, rownum путем разбиения на разделы не нужно перечитывать на каждой итерации. – sak

0

Oracle предоставляет collection для выполнения таких работ. Вы можете создать RECORD и выполнить свое требование. См. Пример ниже:

create or replace procedure proc 
as 

-- This should have same columns as you are selecting from the query below. 
type x is record (col1 number, 
        col2 number, 
        . 
        . 
        . 
       ); 

type var is table of x index by pls_integer; 

var1 var; 

begin 

    select x,y,.. 
    bulk collect into var1 
    from tableA, 
    (rownum() over partiton by x)new_col 
    where ...(list of conditions) .... ; 


    for rec in 1..var1.count 
    loop 

     update tableA 
     where new_col= var1.col1 ; 

    end loop; 


end;