Locked History Actions

Materialy Kursor

Kursory

KURSORY rozszerzają (w odniesieniu do SELECT) pojęcie zbioru wyników i umożliwiają aplikacji pracę z każdym z rekordów z osobna

Składnia:

DECLARE cursor_name CURSOR 
[ LOCAL | GLOBAL ] 
[ FORWARD_ONLY | SCROLL ] 
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] 
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] 
[ TYPE_WARNING ] 
FOR select_statement 
[ FOR UPDATE [ OF column_name [ ,...n ] ] ]

To polecenie ustala parametry kursora oraz definiuje zapytanie (FOR SELECT ...) na wyniku którego kursor będzie operował

Ponadto:

  • OPEN – tworzy zbiór wynikowy
  • FETCH – zwraca wiersz ze zbioru wyników (NEXT, PRIOR, FIRST, LAST, ABSOLUTE[n,@zmienna], RELATIVE[n,@zmienna] – wszystkie opcje pobierania danych dostępne tylko w kursorze typu SCROLL)
  • CLOSE – zwalnia bieżący zbiór wynikowy związany z kursorem
  • DEALOCATE – zwalnia zasoby używane przez kursor

Zmienne globalne:

  • @@FETCH_STATUS - stan operacji FETCH (0, -1, -2)
    • 0 - wyrażenie FETCH zakończyło się sukcesem
    • -1 - wyrażenie FETCH zakończyło się niepowodzeniem (rekord poza zakresem kursora)
    • -2 - brak wiersza do którego odnosi się FETCH (np. został usunięty)
  • @@CURSOR_ROWS – liczba wierszy w kursorze

Pomocne procedury systemowe:

  • sp_cursor_list - wykaz otwartych kursorów
  • sp_describe_cursor – opisuje atrybuty kursora (statyczny, dynamiczny, „tylko do przodu”, zbiory kluczy (keyset)...)
  • sp_describe_cursor_columns – opisuje atrybuty pola
  • sp_describe_cursor_tables – podaje tabele do których odwołuje się kursor

Przykłady

1. Prosty kursor, zwraca nazwiska pracownikow

declare @nazwisko varchar(20)

DECLARE kur1 CURSOR
FOR  select nazwisko from pracownicy
OPEN kur1
FETCH NEXT from kur1 into @nazwisko
print @nazwisko
while @@fetch_status=0
begin
  print '@@fetch_status = ' + cast(@@fetch_status as char(2))           -- 0
  FETCH NEXT from kur1 into @nazwisko
  print @nazwisko
end
print '@@fetch_status = ' + cast(@@fetch_status as char(2))             -- -1
CLOSE kur1
DEALLOCATE kur1

2. Modyfikowanie wartości w tabeli z uzyciem kursora

DECLARE kur2 CURSOR
FOR  select * from pracownicy

OPEN kur2
FETCH NEXT from kur2

while @@fetch_status=0
begin
  UPDATE pracownicy SET dod_funkc=dod_funkc+5
  WHERE CURRENT OF kur2
  FETCH NEXT from kur2
end

CLOSE kur2
DEALLOCATE kur2