如何让游标拾取table数据变化?

How to make a cursor pick table data change?

我在程序中有以下光标:

procedure Run is
    Cur Cursor is select * from table where condition;
    R Cur%rowtype;

    Open Cur;
    loop
        fetch Cur into R;
        exit when Cur%notfound;

        -- Run some time consuming operations here
        something...
    end loop;
    Close Cur;
end;

此光标是 运行 计划作业。

假设当运行连接这个游标时,有100行满足where条件。

如果在过程 运行ning 时,我在 table 中插入了满足相同 where 条件的新行,请问有没有办法让光标也选择这些新行?

谢谢。 干杯,

您可以在循环内提​​交,以便 select 查询在每次迭代中从 table 获取最新记录。

不,游标无法做到这一点。交易是一致的,您的光标是您提取的数据的快照。 如果您想要一致的结果,您可以:

  1. 锁定 table 这样就不会发生任何变化,
  2. 使用其他机制,例如将逻辑移至触发器,该触发器将对满足您条件的每个新数据执行(并带来开销,因此非常有情境)

没有

游标将 return 的行集在打开游标时确定。届时,Oracle 知道当前的 SCN(系统更改编号)并将 return 数据在该时间点存在。

根据问题的性质,您可以编写一个循环,只不断询问满足条件的单行(假设您的 time-consuming 操作更新了一些数据,以便您知道需要什么处理)。像

loop
  begin
    select some_id
      into l_some_id
      from your_table
     where needs_processing = 'Y'
     order by some_id
     fetch first row only;
  exception
    when no_data_found
    then
      l_some_id := null;
  end;
  
  exit when l_some_id is null;
      
  some_slow_operation( l_some_id );
end loop;

假设 some_slow_operationneeds_processing 标志更改为 N。并假设您正在使用默认的已提交读取事务隔离级别。