循环遍历结果集时更新或插入如何影响结果集本身?

时间:2012-02-16 13:45:01

标签: sql plsql resultset

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

这对结果集有何影响?我倾向于认为,由于获取此RS的声明在此过程中较早执行,因此该RS现在将对我准备好的声明所做的更改视而不见。

伪代码:

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

Read Consistency

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

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

insert into t
select * from t;

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

因此有其他影响。

1)Oracle从回滚段读取,为您提供此数据的读取一致图像。因此,如果您的回滚段大小不正确,或者您提交了多个提取,则会出现“Snapshot too old”错误,因为您的回滚数据不再可用。

好的,如果是这样的话,是否可以在进行更新时刷新它?我的意思是除了使游标可更新并使用结果集的内置函数。

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