2013-03-01 14 views
6

Załóżmy, że mam coś takiego:Kiedy wykonywane jest zapytanie w kursie?

CURSOR foo_cur IS 
    SELECT * FROM foo; 

... 

DELETE FROM foo WHERE bar=1; 

FOR row IN foo_cur 
LOOP 
... 
END LOOP; 

Gdybym usuwać wiersze z foo zanim otworzę kursor będzie te wiersze nadal być częścią wyniku kursorem? Czy zapytanie SELECT * FROM foo zostało wykonane na linii FOR row IN foo_cur?

Odpowiedz

12

Zestaw wierszy, które zostaną zwrócone z kursora, jest określany w punkcie, w którym kursor jest otwarty (za pośrednictwem wyraźnej OPEN lub niejawnie przez pętlę FOR). W takim przypadku usunięty wiersz nie zostanie zwrócony w pętli.

Ogólnie rzecz biorąc, zapytanie nie jest wykonywane wszystkie naraz. Oracle wykonuje kwerendę na tyle, aby pobrać następny zestaw wierszy, zwraca te wiersze do maszyny wirtualnej PL/SQL i czeka, aż żądanie przyjdzie, aby pobrać więcej wierszy. W 11g, Oracle wykona domyślnie BULK COLLECT z 100 wierszy na raz, więc co 100 iteracji w pętli zapytanie jest wykonywane dalej, dopóki nie będzie już wierszy do zwrócenia. Ze względu na spójność odczytu w wielu wersjach, Oracle zawsze zwróci dane do ciebie, ponieważ istniało, gdy kursor był otwarty, nawet jeśli inne sesje są dokonywane i zatwierdzanie zmian podczas działania kodu.

+0

Niesamowite, właśnie takie wyjaśnienie, którego szukałem. Dzięki! – DiscoInfiltrator

Powiązane problemy