在结果集中循环时更新或插入对结果集本身有何影响



假设我根据某些条件获取一个RS并开始循环,然后在某些情况下,我使用单独准备的语句更新insert或delete记录,这些记录可能是该RS的一部分。

这对结果集有何影响?我倾向于认为,由于提取这份RS的声明是在该过程的早些时候执行的,这份RS现在将对我准备的声明所做的更改视而不见。

伪码:

Preapare Statement ps1
execute ps1 -> get Result Set rs1
loop through rs1
    {
     Update or delete records using other prepared statements
    }

读取一致性

Oracle保证语句所看到的数据集在单个时间点上是一致的,并且在语句执行期间不会发生变化(语句级读取一致性)

这就是为什么,如果你有一个像这样的查询

insert into t
select * from t;

Oracle将简单地复制所有行,而不会进入无限循环或引发错误。

因此还有其他的影响。

1) Oracle从回滚段读取数据,为您提供数据的读取一致性映像。因此,如果回滚段的大小不正确,或者跨回迁提交,则会出现"快照太旧"错误,因为回滚数据不再可用。

好的,如果是这样的话,有可能在更新的同时刷新它吗?我的意思是,除了使光标可更新和使用结果集的内置函数之外

2) 每个查询都会看到开始时的数据。如果您所说的刷新意味着重新初始化查询,那么如果您在pl/sql主体或pl/sql循环中进行提交,或者如果系统中同时运行其他一些事务,则您看到的数据可能会再次不同。

没有。查询/游标的结果集由数据库保留,即使您更改或删除了作为该结果集基础的行。所以你是对的,它对语句执行后所做的更改是盲目的。

最新更新