2013-06-26 16 views
12

Podobnie jak w temacie. Czy mogę po prostu zresetować pozycję kursora na początek w języku Transact-SQL, aby można było ponownie uruchomić nad tabelą? Chcę zresetować go w następującym kontekście:Czy mogę zresetować położenie kursora na początek?

DECLARE @userID INT 
DECLARE user_cursor CURSOR FOR SELECT userID FROM users 

WHILE /* some condition */ 
BEGIN 
... 

    FETCH NEXT FROM user_cursor INTO @userID 

    IF @@FETCH_STATUS = 0 
    BEGIN 
     /*... here goes the reset of the cursor ...*/ 
    END 

... 
END 
+1

Patrz poniżej linkiem: http://stackoverflow.com/questions/2909357/start-position-for-a-reused-t -sql-kursor – bgs

Odpowiedz

21

trzeba zadeklarować kursor w postaci zwoju, jak to

declare c scroll cursor for (select statement); 

następnie w dowolnym momencie do lokalizowania do pierwszego wystarczy użyć następującego

fetch first from c; 
+0

dla zapobiegania zmianom (aktualizacja/usuwanie) zadeklarowałbyś kursor CZYTAJ TYLKO zaraz po przewinięciu –

+0

Musisz również zadeklarować kursor jako 'DECLARE @CursorX SCROLL CURSOR SELECT ...' lub 'SET @CursorX = CURSOR SCROLL FOR SELECT .... ' –

1

Dane pobierane przez kursor nie zmienią się.

STATIC

Definiuje kursor, który sprawia, że ​​tymczasowa kopia danych do wykorzystania przez kursor. Wszystkie żądania do kursora są odpowiedzią z tej tabeli tymczasowej w tempdb; w związku z tym modyfikacje wprowadzone do tabel podstawowych nie są odzwierciedlane w danych zwracanych przez pobrane dane do tego kursora, a ten kursor nie zezwala na modyfikacje.

9

Innym rozwiązaniem, które może być używane, które nie zmuszają do zmiany typu kursora jest po prostu close kursor i ponownie open go:

CLOSE user_cursor 
OPEN user_cursor 

Ale scroll option będą tańsze w kategoriach wykorzystanie zasobów, jeśli jest to zmiana, którą możesz zaakceptować.

+0

Czy wiesz, która metoda jest szybsza? –

+1

@OskarSzura - jak już wspomniałem, przewijanie powinno być tańsze (w miejscu, w którym wypisujesz 'fetch first'). Z drugiej strony może być droższe podczas początkowego "otwartego". Ale jedyny sposób, by naprawdę wiedzieć, to wypróbować oba z * twoimi * danymi, * twoimi * indeksami, * twoim * sprzętem itp. –

+0

OK, za dużo za podpowiedź. –

-2

Stosować pętle kursor i jego pod opieką dla Ciebie ...

cursor c_something IS 
    select * from somewhere 

BEGIN 

    for some_row in c_something LOOP 
     -- do stuff with some_row.COLUMN; 
    END LOOP; -- this closes the cursor for you when it has gone all the way through 

    -- do other stuff 

    for some_row in c_something LOOP -- opens the cursor again from the top 
     -- do stuff with some_row.COLUMN; 
    END LOOP; 

END; 
+0

To nie działa, czy możesz wyjaśnić? –

+0

To działa dla mnie z Oracle 11g – WebWeasel

+0

Pytanie dotyczy SQL Server/Sybase TSQL, a nie Oracle, prawda? –

Powiązane problemy