【问题标题】:When is the query in a cursor executed?游标中的查询何时执行?
【发布时间】:2013-02-16 03:59:20
【问题描述】:
假设我有类似的东西:
CURSOR foo_cur IS
SELECT * FROM foo;
...
DELETE FROM foo WHERE bar=1;
FOR row IN foo_cur
LOOP
...
END LOOP;
如果我在打开游标之前从foo 中删除行,这些行是否仍然是游标结果的一部分?查询SELECT * FROM foo 是否在FOR row IN foo_cur 行执行?
【问题讨论】:
标签:
sql
oracle
plsql
oracle11g
database-cursor
【解决方案1】:
将从游标返回的行集在游标打开时确定(通过显式OPEN 或通过FOR 循环隐式)。在这种情况下,您删除的行将不会在您的循环中返回。
通常,查询不会一次全部执行。 Oracle 执行足够多的查询以获取下一组行,将这些行返回给 PL/SQL VM,并等待直到请求来获取更多行。在 11g 中,Oracle 将一次执行 100 行的隐式 BULK COLLECT,因此每 100 次循环迭代,查询将进一步执行,直到没有更多行返回。由于多版本读取一致性,Oracle 将始终将打开游标时的数据返回给您,即使在您的代码运行时其他会话正在进行并提交更改。