Как заставить мой блок Oracle PL / SQL обновить все записи, связанные с row_ids, на которые ссылается мой курсор - PullRequest
0 голосов
/ 21 мая 2018

В настоящее время у меня есть хранимая процедура Oracle, которая берет данные из таблиц.Проблема в том, что я агрегирую / группирую, и я не хочу захватывать идентификаторы, иначе это скинет группировку.Я хочу обновить столбец с именем «correlated_flag_id» до «1» (готово) в таблице значений после того, как я вставил агрегированный / сгруппированный набор результатов.Я только хочу получить идентификаторы, которые связаны со значениями, которые мой первый курсор захватил, чтобы получить результаты.Ниже моя попытка (которую я не считаю правильной):

 Create or Replace PROCEDURE PROC is
 CURSOR c1 is
        select sum(v.value_tx) as sum_of_values
      , max(v.create_dt) as latest_create_dt
      , v.data_date
          from value v
      group by v.data_date, max(v.create_dt)
 BEGIN
 Open c1;
 LOOP
         Fetch c1 into l_var;
                insert into value (value_id, value_tx, create_dt, data_date)
                           values (null, l_var.sum_of_values, l_var.latest_create_dt, l_var.data_Date);
 END LOOP;
 Close c1;
commit;
--- the bottom is not correct, but i've reached a roadblock
Update value
   set correlated_flag_id = 777
 where value_id in (select v.value_id from value where trunc(create_dt) <> trunc(sysdate)) (???));
 commit;
 END PROC;

Заранее спасибо и, пожалуйста, дайте мне знать, если есть какие-либо подробности, которые мне нужно предоставить.

1 Ответ

0 голосов
/ 21 мая 2018
  • выбор курсора является неправильным;почему вы группируете по функции MAX?Здесь не разрешено
  • переключаться на курсорный цикл FOR, поскольку его легче поддерживать.Вам не нужно открывать курсор, извлекать, выходить цикл (который вы вообще не делали), закрывать курсор
  • Я не уверен, что делает таблица VALUE_930здесь, вы никогда не упоминали об этом
  • ваши слова говорят «обновить коррелированный идентификатор до 1», а код говорит «обновите его до 777»
  • не фиксируйте в процедуре;пусть вызывающий абонент решит, следует ли это сделать
  • Я бы предложил вам либо использовать инструмент, который предлагает форматирование кода, либо отформатировать его самостоятельно.Ваша процедура не является результатом наводнения, поэтому не относитесь к ней таким образом

Наконец, вот предложение, которое может (или не может) работать, поскольку у нас нет ни ваших таблиц, ни данных, но - по крайней мере - выглядит прилично.

create or replace procedure proc is
begin
  for cur_r in (select v.data_date,
                       sum(v.value_tx) as sum_of_values,
                       max(v.create_dt) as latest_create_dt
                from value v
                group by v.data_date)
  loop
    insert into value (value_id, value_tx, create_dt, data_date)
      values (null, cur_r.sum_of_values, cur_r.latest_create_dt, cur_r.data_date);

    update value set
      correlated_flag_id = 777
      where data_date = cur_r.data_date;
  end loop;
end proc;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...