plsql - 仅使用光标选择行一次

标签 plsql oracle11g

我在 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/

相关文章:

java - Oracle 数据源连接池不适用于 Spring 和 JDBCTemplate

sql - 替换 Oracle 过程中的字符串

java - ClassCastException : java. lang.Double 与 java.math.BigDecimal 不兼容

oracle - 在存储过程中将Select分配给变量

java - 当过程不停止时,Java SQL 异常不显示 Oracle 异常

oracle - 禁用与丢弃约束

mysql - Oracle圆距离搜索: missing results

sql - Oracle SQL 按单个字段分组并计算分组的行数

oracle - Oracle NUMBER 数据类型中的精度和小数位数是什么意思

sql - 甲骨文 : ROW_NUMBER 20 times faster than ROWNUM