2013-03-01 12 views
6

Supponiamo che ho qualcosa di simile:Quando viene eseguita la query in un cursore?

CURSOR foo_cur IS 
    SELECT * FROM foo; 

... 

DELETE FROM foo WHERE bar=1; 

FOR row IN foo_cur 
LOOP 
... 
END LOOP; 

Se cancello righe dalla foo prima di aprire il cursore, saranno queste righe ancora parte del risultato cursore? La query SELECT * FROM foo è stata eseguita alla riga FOR row IN foo_cur?

risposta

12

L'insieme di righe che verrà restituito da un cursore viene determinato nel punto in cui il cursore viene aperto (tramite un esplicito OPEN o implicitamente dal ciclo FOR). In questo caso, le righe che hai eliminato non verranno restituite nel tuo ciclo.

Generalmente, la query non viene eseguita tutto in una volta. Oracle esegue la query in modo sufficiente per recuperare il successivo gruppo di righe, restituisce quelle righe al PL/SQL VM e attende fino a quando la richiesta non viene a recuperare più righe. In 11g, Oracle eseguirà un numero implicito BULK COLLECT di 100 righe alla volta, quindi ogni 100 iterazioni del ciclo la query verrà eseguita ulteriormente fino a quando non ci saranno più righe da restituire. A causa della consistenza della lettura in più versioni, Oracle restituirà sempre i dati all'utente al momento dell'apertura del cursore, anche se altre sessioni eseguono e eseguono modifiche mentre il codice è in esecuzione.

+0

Impressionante, solo il tipo di spiegazione che stavo cercando. Grazie! – DiscoInfiltrator

Problemi correlati