假设我根据某些条件获取RS并开始循环,然后,在某些情况下,我使用单独的预准备语句更新插入或删除记录,这些记录可能是此RS的一部分。
这对结果集有何影响?我倾向于认为,由于获取此RS的声明在此过程中较早执行,因此该RS现在将对我准备好的声明所做的更改视而不见。
伪代码:
Preapare Statement ps1
execute ps1 -> get Result Set rs1
loop through rs1
{
Update or delete records using other prepared statements
}
答案 0 :(得分:0)
没有。查询/游标的结果集由数据库保留,即使您更改或删除作为此结果集基础的行也是如此。所以你是对的,在执行语句后所做的更改是盲目的。
答案 1 :(得分:0)
Oracle保证语句看到的数据集与单个时间点保持一致,并且在语句执行期间不会发生变化(语句级读取一致性)
这就是为什么,如果你有一个查询,如
insert into t
select * from t;
Oracle将简单地复制所有行,而不会进入无限循环或引发错误。
因此有其他影响。
1)Oracle从回滚段读取,为您提供此数据的读取一致图像。因此,如果您的回滚段大小不正确,或者您提交了多个提取,则会出现“Snapshot too old”错误,因为您的回滚数据不再可用。
好的,如果是这样的话,是否可以在进行更新时刷新它?我的意思是除了使游标可更新并使用结果集的内置函数。
2)每个查询都会看到它开始时的数据。如果通过刷新意味着重新启动查询,那么您看到的数据可能会再次不同,如果您在pl / sql体中提交或在pl / sql循环中提交,或者同时在系统中运行某些其他事务。