Blog JSystems - uwalniamy wiedzę!

Szukaj

Kursor, w skrócie

Iteracja po wierszach:

DECLARE cur CURSOR FOR SELECT Id FROM Klienci;
OPEN cur;
FETCH NEXT FROM cur INTO @Id;
WHILE @@FETCH_STATUS = 0
BEGIN
  FETCH NEXT FROM cur INTO @Id;
END
CLOSE cur; DEALLOCATE cur;

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:

FETCH: Kursory w SQL (T-SQL)

 

Baner szkolenia Kompleksowe SQL w Microsoft SQL Server w JSystems, terminy gwarantowane

Szkolenie Kompleksowe SQL w Microsoft SQL Server →

To szkolenie może być dofinansowane dla Ciebie z KFS lub BUR.

★★★★★Średnia ocena naszych szkoleń w Google: 5/5

Najczęściej zadawane pytania

Czym jest kursor w T-SQL?
Kursor to mechanizm, który przechodzi przez zestaw danych i zwraca kolejne wiersze jeden po drugim. Nazwa pochodzi od łacińskiego słowa oznaczającego biegacza, bo kursor biegnie po zbiorze wyników zapytania SELECT.
Jakie są kroki pracy z kursorem?
Najpierw deklarujemy kursor przez DECLARE ... CURSOR FOR z zapytaniem SELECT, otwieramy go przez OPEN, pobieramy wiersze przez FETCH, a na końcu zamykamy przez CLOSE i usuwamy definicję przez DEALLOCATE, co zwalnia zasoby i blokady.
Jak sprawdzić, czy FETCH pobrał wiersz?
Służy do tego zmienna systemowa @@FETCH_STATUS. Wartość 0 oznacza, że wiersz udało się pobrać, a inne wartości sygnalizują brak kolejnych wierszy lub żądany wiersz nie istnieje. Zwykle używa się jej w pętli WHILE.
Jakie typy kursorów dzielimy w T-SQL?
Kursory dzielimy na statyczne (tylko do odczytu), kluczowe (do odczytu lub aktualizacji), dynamiczne (dopuszczają wszelkie zmiany) oraz błyskawiczne, czyli nieprzewijane i tylko do odczytu, które są najszybsze.
Co robią opcje FETCH inne niż NEXT?
NEXT pobiera następny rekord i jest domyślny, PRIOR poprzedni, FIRST pierwszy, a LAST ostatni. ABSOLUTE n przechodzi do konkretnej pozycji, a RELATIVE n przeskakuje o wskazaną liczbę wierszy względem bieżącej pozycji.

Komentarze (0)

Musisz być zalogowany by móc dodać komentarz. Zaloguj się przez Google

Brak komentarzy...