如何让Oracle PL/SQL块更新与游标引用的行ID相关的所有条目

如何让Oracle PL/SQL块更新与游标引用的行ID相关的所有条目,oracle,plsql,Oracle,Plsql,我目前有一个从表中获取数据的Oracle存储过程。问题是我正在聚合/分组,我不想获取ID,否则会导致分组失败。我想在插入聚合/分组结果集后,将值表中名为“correlated\u flag\u id”的列更新为“1”。我只想获取与 我的第一个光标抓取以导出结果的值。以下是我认为不正确的尝试: Create or Replace PROCEDURE PROC is CURSOR c1 is select sum(v.value_tx) as sum_of_values

我目前有一个从表中获取数据的Oracle存储过程。问题是我正在聚合/分组,我不想获取ID,否则会导致分组失败。我想在插入聚合/分组结果集后,将值表中名为“correlated\u flag\u 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;
提前谢谢,如果有更多的细节需要我提供,请告诉我

光标的选择有点错误;为什么要按MAX函数分组?这里是不允许的 切换到循环光标,因为它更易于维护。您不必打开游标、获取、退出根本没有执行的循环、关闭游标 我不确定表的值是什么,您从未提到过 您的话说将相关ID更新为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;
/

那么您的值表没有主键?看起来您在某种程度上使用value\u id作为主键,除非它是null,然后它是null+data\u date作为主键?但是您想为所有在今天以外的一天创建的标志ID设置。。。在这种情况下,是否有可能创建一个临时表,其中包含您希望在运行时更新的ID?我有一个主键,我有一个触发器,可以自动按顺序生成一个值\u ID。