如何让Oracle PL/SQL块更新与游标引用的行ID相关的所有条目
我目前有一个从表中获取数据的Oracle存储过程。问题是我正在聚合/分组,我不想获取ID,否则会导致分组失败。我想在插入聚合/分组结果集后,将值表中名为“correlated\u flag\u id”的列更新为“1”。我只想获取与 我的第一个光标抓取以导出结果的值。以下是我认为不正确的尝试:如何让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
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。