2013-03-01 5 views
6

Angenommen, ich habe so etwas wie:Wann wird die Abfrage in einem Cursor ausgeführt?

CURSOR foo_cur IS 
    SELECT * FROM foo; 

... 

DELETE FROM foo WHERE bar=1; 

FOR row IN foo_cur 
LOOP 
... 
END LOOP; 

Wenn ich Zeilen aus foo löschen, bevor ich den Cursor öffnen, wird noch diese Zeilen Teil des Cursors Ergebnis sein? Wird die Abfrage SELECT * FROM foo an der Zeile ausgeführt?

Antwort

12

Die Menge der Zeilen, die von einem Cursor zurückgegeben werden, wird an dem Punkt bestimmt, an dem der Cursor geöffnet wird (entweder über eine explizite OPEN oder implizit durch die FOR-Schleife). In diesem Fall werden die gelöschten Zeilen nicht in Ihrer Schleife zurückgegeben.

Im Allgemeinen wird die Abfrage nicht auf einmal ausgeführt. Oracle führt die Abfrage aus, um die nächste Reihe von Zeilen abzurufen, gibt diese Zeilen an die PL/SQL-VM zurück und wartet, bis die Anforderung weitere Zeilen abruft. In 11g führt Oracle implizit BULK COLLECT von 100 Zeilen gleichzeitig aus, so dass alle 100 Iterationen der Schleife die Abfrage weiter ausgeführt wird, bis keine weiteren Zeilen zurückgegeben werden. Aufgrund der Lesekonsistenz mehrerer Versionen gibt Oracle die Daten immer so zurück, wie sie beim Öffnen des Cursors vorhanden waren, auch wenn während der Ausführung des Codes andere Sitzungen Änderungen vornehmen und Änderungen vornehmen.

+0

Super, genau die Art von Erklärung, die ich suchte. Vielen Dank! – DiscoInfiltrator

Verwandte Themen