我在 PL/SQL 中有一个情况,我的过程每分钟都会被一个作业调用。代码如下
procedure ExecuteProc is
CURSOR c1 IS
SELECT *
FROM test6
where processed = 'N';
BEGIN
-- Make all rows selected in the cursor processed 'Y' but
-- the cursor below would fail
for rec in c1
loop
-- some proccessing which takes 5 -6 minutes
delete from test6 where id = rec.id;
end loop;
END;
test6 表中的示例数据
id processed
1 N
2 N
3 N
当第一次调用过程时,id 1,2 和 3 被游标中的过程拾取。请注意,这些行也存在于表 test6 中,除非每个 id 的处理都已完成。这意味着当在下一分钟第二次调用该过程时,该过程将再次选择 1,2 和 3。我怎样才能避免这种情况?我正在考虑以某种方式将“已处理”字段设置为“Y”,但是(请参阅我在光标会失败的代码中的评论)。
请帮忙
最佳答案
尝试在删除之前锁定该行:
procedure ExecuteProc is
CURSOR c1 IS
SELECT *
FROM test6
where processed = 'N';
BEGIN
-- Make all rows selected in the cursor processed 'Y' but
-- the cursor below would fail
for rec in c1
loop
if rec.processed <> 'L' then
-- some proccessing which takes 5 -6 minutes
update test6 set processed ='L' where id = rec.id; -- lock status
delete from test6 where id = rec.id;
end if;
end loop;
END;
您一定会删除正确的。 但是您必须优化处理过程背后的过程调用。
关于plsql - 仅使用光标选择行一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22985852/