Blog JSystems - z miłości do programowania

Szukaj

Kursory w T-SQL

Słowo KURSOR pochodzi od łacińskiego słowa oznaczającego biegacza i dobrze opisuje działanie kursora w języku T-SQL: gdyż "biegnie" on przez zestaw danych, zwracających kolejne wiersze.


Kursory w T-SQL dzielimy na:


-statyczne – tylko do odczytu, jedno lub dwu kierunkowe


-kluczowe – do odczytu lub odczytu i aktualizacji, jedno lub dwu kierunkowe


-dynamiczne – są możliwe wszelkiego rodzaju zmiany na rekordach -błyskawiczne – nieprzewijane, tylko do odczytu.


Składnia


DECLARE nazwa_kursora CURSOR FOR instrukcja SELECT OPEN nazwa_kursora (otwiera kursor)


Pobranie kolejnego wiersza ( w T-SQL nie istnieją zmienne typu wierszowego, a więc trzeba wcześniej zadeklarować tyle zmiennych, ile wartości zwróci instrukcja SELECT kursora). Kolejność zwracania wartości/wierszy z kursora jest zgodna z instrukcją SELECT.


FETCH NEXT FROM nazwa_kursora INTO zmienne


Do sprawdzenia czy instrukcja FETCH zwróciła wiersz służy zmienna systemowa @@FETCH_STATUS (0 – udało się pobrać wiersz, 1 – nie ma dalszych wierszy (polecenie zakończyło się błędem, 2 – żądany wiersz nie istnieje – nie pobrano żadnego)


WHILE @@FETCH_STATUS = 0 ...


CLOSE nazwa_kursora (zwalnia zasoby oraz zwalnia ewentualne blokady)


DEALLOCATE nazwa_kursora (powoduje usunięcie definicji kursora)


Parametry


-FORWARD_ONLY (tworzy kursor przewijany tylko od pierwszego rekordu do ostatniego. Możliwa opcja FETCH NEXT (DEFAULT)) lub SCROLL (przewijanie - wszystkie opcje przewijania są możliwe)


-LOCAL (widoczny w ramach danej sesji) lub GLOBAL (widoczny również poza daną sesją)


 


Blokady:


READ_ONLY – powoduje, że kursor nie może modyfikować danych źródłowych.


SCROLL_LOCKS – powoduje, że dane źródłowe będą mogły być aktualizowane jedynie przez kursor. Każda inna instrukcja UPDATE wykonywana przez innego użytkownika nie wykona się ze względu na blokady zakładane przez kursor.


OPTIMISTIC – pozwala na aktualizację rekordów poprzez kursor i innych uzytkowników, nie gwarantuje jednak poprawności wykonania instrtukcji UPDATE wewnątrz kursora z uwagi na możliwy UPDATE przez inne sesje.


Typy:


STATIC – kopiuje tymczasowo dane z kursora do tabeli TEMPDB


KEYSET – określa kolejność w kursorze. Jeśli zapytanie nie posiada żadnego indexu UNIQUE konwertowany jest na STATIC


DYNAMIC – wszelkie modyfikacje są mozliwe


FAST_FORWARD – optymalizuje działanie kiursora z odpowiednimi opcjami przewijania


FETCH


Instrukcja FETCH pobiera dane z kursora, zgodnie z podaną informacją:


NEXT - pobiera następny rekord (DEFAULT)


PRIOR - pobiera poprzedni rekord


FIRST - pobiera pierwszy rekord


LAST - pobiera ostatni rekord


ABSOLUTE n - skok bezwzględny o n


RELATIVE n - skok bezwzględny o n


Poniżej prosty kod ukazujący działanie kursora:



 

Przyjdź do nas na szkolenie z baz danych SQL Server! Mamy szereg szkoleń w ofercie: SQL, T-SQL, tuning, administracja i wiele innych. Sprawdź dostępne szkolenia SQL Server
Zapisz się do newslettera aby otrzymywać najnowsze świeżynki pojawiające się na blogu! Zapisz się do newslettera