2013-03-01 63 views
6

假设我有这样的:何时执行游标中的查询?

CURSOR foo_cur IS 
    SELECT * FROM foo; 

... 

DELETE FROM foo WHERE bar=1; 

FOR row IN foo_cur 
LOOP 
... 
END LOOP; 

如果我删除foo行之前,我打开游标,将这些行仍然是游标结果的一部分?是否在FOR row IN foo_cur行执行查询SELECT * FROM foo

回答

12

将在光标打开的位置(通过明确的OPEN或隐含地通过FOR循环)确定将从游标返回的行集。在这种情况下,您删除的行将不会返回到您的循环中。

通常,查询不会一次全部执行。 Oracle执行足够的查询来获取下一组行,将这些行返回给PL/SQL VM,并等待请求来获取更多行。在11g中,Oracle将一次执行100行的隐式BULK COLLECT,因此每循环100次循环,查询就会执行一次,直到没有更多行返回。由于多版本读取一致性,即使其他会话在您的代码运行时进行更改并提交更改,Oracle仍将始终将数据返回给您,因为它在光标打开时仍然存在。

+0

太棒了,只是我寻找的那种解释。谢谢! – DiscoInfiltrator 2013-03-01 15:46:44