如何让游标拾取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 获取最新记录。
不,游标无法做到这一点。交易是一致的,您的光标是您提取的数据的快照。
如果您想要一致的结果,您可以:
- 锁定 table 这样就不会发生任何变化,
- 使用其他机制,例如将逻辑移至触发器,该触发器将对满足您条件的每个新数据执行(并带来开销,因此非常有情境)
没有
游标将 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_operation
将 needs_processing
标志更改为 N。并假设您正在使用默认的已提交读取事务隔离级别。
我在程序中有以下光标:
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 获取最新记录。
不,游标无法做到这一点。交易是一致的,您的光标是您提取的数据的快照。 如果您想要一致的结果,您可以:
- 锁定 table 这样就不会发生任何变化,
- 使用其他机制,例如将逻辑移至触发器,该触发器将对满足您条件的每个新数据执行(并带来开销,因此非常有情境)
没有
游标将 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_operation
将 needs_processing
标志更改为 N。并假设您正在使用默认的已提交读取事务隔离级别。