KURSORY: CURSORS

Kursy Online SQL Server Bazy Danych Microsotf Kursory Cursors Andrzej Śmigielski

KURSOR (CURSOR)

 
          KURSOR jest strukturą umożliwiającą przetwarzanie wielu wierszy zwracanych w określonej kolejności przez zapytanie na zasadzie „wiersz po wierszu”.
Implementacja kursora wymaga:
deklaracji
określenia sposobu działania
zamknięcia
zwolnienia zasobów.
Powyższe właściwości pozwalają na zdefiniowanie wrażliwości kursora (SENSITIVITY), kierunku działania (FETCH) oraz dozwolonych operacji do wykonania na operowanym zbiorze.
 

(+) PLUSY KORZYSTANIA Z KURSORÓW:

Możliwość przeglądania wierszy w dowolny sposób.
Lokalny oraz globalny zasięg.
Możliwość stosowania blokowań.
 

(-) MINUSY KORZYSTANIA Z KURSORÓW:

Wykorzystują one stosunkowo dużo zasobów sprzętowych w porównaniu z implementacjami opartymi na zbiorach.
Nie biorą pod uwagę wewnętrznych mechanizmów dotyczących optymalizowania zapytań, więc są stosunkowo wolniejsze od alternatywnych rozwiązań opartych na zbiorach.
 

KIEDY I W JAKICH SYTUACJACH WARTO KORZYSTAĆ Z KURSORÓW:

W procedurach oraz skryptach wykonujących czynności administracyjne, które zazwyczaj mogą być wykonywane np. jednorazowo w ciągu doby, w przeciwieństwie do dziesiątek, setek, tysięcy czy milionów operacji wykonywanych bezpośrednio na danych każdego dnia.
W zadaniach wymagających uruchamiania procedur lub bloków kodu proceduralnego dla wielu rekordów z tabel (kod proceduralny jest szczegółowo opisany w kilku lekcjach kursu zaawansowanego).
W przypadkach, kiedy odpytywanie oraz modyfikowanie nie dotyczy stosunkowo dużych ilości danych.
W sytuacjach, kiedy bardzo duże znaczenie ma kolejność wykonywanych kroków oraz ich wpływ na obiekty bazodanowe.
 

KURSOR – CZY TO DOBRE ROZWIĄZANIE?

          Chcę Ci na to pytanie odpowiedzieć, ponieważ jest to bardzo częste pytanie nie mające jednoznacznej odpowiedzi, natomiast patrząc z wielu perspektyw będziesz w stanie sam/sama stwierdzić, czy jest to optymalne czy nie rozwiązanie Twojego konkretnego przypadku.
Powracając do pytania: „Kursor – czy to dobre rozwiązanie?”
To zależy do czego chcemy go wykorzystać. Problem polega na tym, że wielu developerów nie ma świadomości możliwości rozwiązania jednego problemu na wiele sposobów, więc jeśli Ty będziesz posiadał/posiadała szerszą wiedzę, szersze spojrzenie na możliwości jakie oferuje nam MsSQL, to pozwoli Ci ona na dopasowanie implementacji do rozwiązania Twojego konkretnego problemu pod kątem wydajności oraz czasu wykonania.
Celem niniejszego kursu w wersji rozszerzonej jak i w wersji zaawansowanej jest właśnie zapewnienie Ci dostępu do skondensowanej wiedzy, umożliwiającej m.in. podejmowanie decyzji: kiedy warto skorzystać z określonego rozwiązania.

          Opisanie wykorzystania kursorów nie może być jednoznacznie wskazaniem czy należy z niego skorzystać, czy też nie.
Zależy to od specyfiki bazy danych, typów danych, wielkości bazy, współbieżności, więc biorąc pod uwagę tożsame problemy w różnych bazach może się okazać, że w jednej bazie może być to wystarczające rozwiązanie (zazwyczaj nie najlepsze), natomiast w drugiej już niekoniecznie.
 

Poniższa tabela przedstawia możliwości kursorów, funkcje, opcje, właściwości:
 

Polecenia dotyczące implementacji KURSORA:

OPEN Zainicjowanie kursora.
CLOSE Zwolnienie zasobów oraz blokad nałożonych przez kursor.
@@FETCH_STATUS Zmienna zwracająca jedną z trzech wartości:
 0 → Pomyślne zakończenie działania instrukcji.
-1 → Zakończenie działania instrukcji niepowodzeniem, lub wystąpienie wiersza poza zakresem wyniku.
-2 → Brak wierszy do pobrania.
INTO Klauzula umożliwiająca przypisywanie wartości zwracanych przez zapytanie w kursorze do zmiennych kursora.
DEALLOCATE Usunięcie kursora.
GLOBAL (1) Parametr pozwalający uniknąć problemu z istniejącą już nazwą kursora.

Możliwości deklaracji KURSORA:

DYNAMIC Kursor widzi wszystkie dokonane zmiany zarówno przez sam kursor jak i innych użytkowników, widzi także zmiany w ilościach wierszy. Warunkiem korzystania z tej opcji jest odpytanie wierszy z tabeli łącznie z kolumną typu IDENTITY.
FAST_FORWARD Kursor umożliwia korzystanie tylko z opcji FORWARD_ONLY oraz READ_ONLY.
FOR UPDATE OF Pozwala na określenie kolumn, które będzie można modyfikować.
FORWARD_ONLY Kursor umożliwia przewijanie tylko do przodu.
GLOBAL (2) Kursor dostępny we wszystkich sesjach.
INSENSITIVE Kursor wykorzystuje tymczasową kopię danych wykorzystywanych w zapytaniu obiektów i nie zezwala na żadne modyfikacje.
KEYSET Kursor umożliwia zarówno odczytywanie jak i modyfikowanie, może być wielokierunkowy, uwzględnia zmiany dokonane tylko przez sam kursor.
LOCAL Kursor dostępny tylko w ramach bieżącej sesji.
OPTIMISTIC Pozwala na modyfikowanie danych zarówno w kursorze jak i przez innych użytkowników.
READ_ONLY Blokuje możliwość modyfikowania danych źródłowych w kursorze, natomiast inni użytkownicy mogą.
SCROLL Kursor umożliwia odczytywanie wg wszystkich możliwych opcji.
SCROLL_LOCKS Blokuje możliwość modyfikowania danych źródłowych innym użytkownikom, ale sam kursor może.
STATIC Kursor umożliwiający tylko odczytywanie, może być wielokierunkowy.
TYPE_WARNING Parametr powoduje ostrzeganie przy konwersji na inny typ kursora.

Możliwości polecenia FETCH:

ABSOLUTE N Bezwzględny skok do wiersza n, niedostępny w kursorze DYNAMIC.
FIRST Pierwszy wiersz.
LAST Ostatni wiersz.
NEXT Następny wiersz.
PRIOR Poprzedni wiersz.
RELATIVE N Względny skok do wiersza n.

 
 

PLIKI DO ŚCIĄGNIĘCIA:

1. 007_Kursory_Cursors.sql
 

KURSY SQL ONLINE