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.
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.
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)
-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
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:
Komentarze (0)
Brak komentarzy...