2013-03-01 80 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