Serwisanci dostępni teraz · czynne całą dobę, także w weekendy i świętaWarszawa i okolice · dojazd bezpłatny
Darmowa diagnoza laptopa

Darmowa diagnoza laptopa

Dojazd do klienta bezpłatnie

Dojazd do klienta bezpłatnie

Laptopy zastępcze bezpłatnie

Laptopy zastępcze bezpłatnie

Odbiór i zwrot sprzętu bezpłatnie

Odbiór i zwrot sprzętu bezpłatnie

CURSOR

Termin Definicja
CURSOR

CURSOR to mechanizm Transact-SQL umożliwiający przetwarzanie wyników zapytania wiersz po wierszu, w sposób sekwencyjny.

CURSOR w Transact-SQL i przetwarzanie wyników

CURSOR w Transact-SQL jest obiektem używanym do sekwencyjnego odczytywania wierszy zwróconych przez zapytanie w Microsoft SQL Server. Zamiast operować na całym zbiorze jednocześnie, aplikacja lub procedura składowana może pobierać kolejne rekordy i wykonywać dla nich indywidualne instrukcje. Takie podejście bywa potrzebne wtedy, gdy operacja dla jednego wiersza zależy od wyniku poprzedniego albo gdy przetwarzanie wymaga wywołania procedury lub wykonania logiki, której nie da się łatwo wyrazić pojedynczą operacją zbiorową.

Typowy cykl życia kursora obejmuje deklarację, otwarcie, pobranie danych, sprawdzanie statusu, zamknięcie oraz zwolnienie zasobów. W T-SQL stosuje się do tego instrukcje DECLARE CURSOR, OPEN, FETCH, CLOSE i DEALLOCATE. Po wykonaniu FETCH zmienna systemowa @@FETCH_STATUS informuje, czy pobranie wiersza zakończyło się powodzeniem. Dzięki temu można kontrolować pętlę przetwarzającą rekordy aż do osiągnięcia końca wyniku.

Deklaracja, otwarcie i pobieranie wierszy

Kursor jest powiązany z instrukcją SELECT, która określa kolumny oraz zbiór wierszy dostępnych podczas pracy. Przykładowy schemat obejmuje zadeklarowanie kursora dla zapytania, jego otwarcie, a następnie pobieranie wartości do wcześniej zadeklarowanych zmiennych. Pierwsze wykonanie FETCH NEXT ustawia pozycję na pierwszym dostępnym wierszu. Kolejne wykonania przesuwają pozycję kursora do następnych rekordów. Gdy nie ma już wiersza do pobrania, @@FETCH_STATUS przyjmuje wartość różną od zera.

Zakres kursora może być określony jako LOCAL albo GLOBAL. Kursor lokalny jest dostępny w zakresie, w którym został zadeklarowany, natomiast globalny może być widoczny szerzej, zgodnie z regułami obowiązującymi w danej sesji SQL Server. Przy deklaracji można również wskazać sposób przewijania, między innymi FORWARD_ONLY, ograniczający przechodzenie wyłącznie do kolejnych wierszy. Instrukcja FETCH może korzystać także z innych kierunków, jeżeli wybrana konfiguracja kursora dopuszcza przewijanie wstecz lub przechodzenie do określonej pozycji.

Typy kursorów i widoczność zmian

Microsoft SQL Server udostępnia różne właściwości kursora, które wpływają na sposób przechowywania wyników oraz widoczność zmian w tabelach. Kursor STATIC pracuje na tymczasowej kopii danych i nie pokazuje zmian wykonanych później w tabelach źródłowych. KEYSET zachowuje zestaw kluczy identyfikujących wiersze, dzięki czemu część zmian wartości może być widoczna, natomiast zakres zbioru pozostaje określony przez zestaw kluczy. Kursor DYNAMIC może odzwierciedlać zmiany wierszy podczas kolejnych operacji pobierania, zależnie od warunków i użytej konfiguracji.

Osobno określa się możliwość modyfikowania danych oraz sposób współbieżności. Opcja READ_ONLY wskazuje, że kursor służy wyłącznie do odczytu. Przy określonych deklaracjach można używać UPDATE do aktualizowania wiersza wskazywanego przez kursor. SQL Server może stosować między innymi blokowanie optymistyczne albo blokady związane z odczytywanymi wierszami. Wybór typu powinien uwzględniać czas trwania transakcji, liczbę rekordów i możliwość równoczesnych zmian wykonywanych przez inne sesje.

Wpływ kursora na wydajność i diagnostykę

Przetwarzanie wiersz po wierszu często jest kosztowniejsze niż operacja zbiorowa. Pętla z wieloma instrukcjami FETCH może powodować dodatkowe przejścia między silnikiem bazy danych a kodem wykonującym logikę, a także dłużej utrzymywać blokady lub zasoby związane z zapytaniem. Z tego powodu przed zastosowaniem kursora warto sprawdzić, czy zadanie można wykonać instrukcją UPDATE, INSERT, DELETE albo inną operacją działającą na całym zbiorze. Kursor nie jest błędem sam w sobie, ale powinien wynikać z rzeczywistej potrzeby algorytmicznej.

Podczas diagnozowania problemu należy sprawdzić treść zapytania definiującego kursor, kolejność instrukcji OPEN i FETCH, warunek oparty na @@FETCH_STATUS oraz obsługę wyjątków. Istotne jest również potwierdzenie, że po zakończeniu pracy wykonywane są zarówno CLOSE, jak i DEALLOCATE. Brak zamknięcia lub zwolnienia kursora może utrzymywać zasoby dłużej, niż wymaga tego operacja. W środowisku Microsoft SQL Server analizuje się także plan wykonania zapytania, czas przetwarzania, oczekiwania na blokady i liczbę obsługiwanych wierszy, aby rozdzielić problem samego kursora od problemu indeksów lub nieefektywnego zapytania źródłowego.

+48 22 100 48 29Zadzwoń teraz · serwisant w 1 godzinę