Bazy danych
EWSIE
28.11.2010
KURSORY
W PostgreSQL kursor jest wskaźnikiem tylko-do-odczytu do zestawu wyników zakończonej
instrukcji SELECT. Kursory zazwyczaj stosuje się w aplikacjach, które utrzymują trwałe połączenie
z serwerem PostgreSQL. Poprzez utworzenie kursora i utrzymanie połączenia do jego zestawu
wyników, można w bardziej efektywny sposób decydować o tym, które wiersze mają być pobrane z
zestawu wyników w różnych sytuacjach, bez potrzeby ponownego wykonywania zapytania z
klauzulami LIMIT oraz OFFSET. Ponadto kursory stosuje się w celu umożliwienia w obrębie
interfejsu programowania aplikacji wykonania wielu zapytań do tego samego serwera, śledzenia ich
i przetwarzania oddzielnie oraz uniknięcia konieczności zapisywania wszystkich wyników poprzez
aplikację. Kursory można również tworzyć i wykorzystywać bezpośrednio za pomocą
standardowych instrukcji SQL.
W języku SQL mamy cztery instrukcje obsługujące kursory:
1. DECLARE – definiuje i równocześnie otwiera kursor: zdefiniowanie kursora w pamięci,
następnie wypełnienie go informacjami zwróconymi w wyniku wykonania zapytania.
2. FETCH – pozwala pobrać wiersze z otwartego kursora.
3. MOVE – przesuwa bieżące położenie kursora w obrębie zestawu wyników.
4. CLOSE – zamyka kursor i zwalnia przydzieloną pamięć.
DEKLARACJA KURSORA
Instrukcja DECLARE powoduje zarówno utworzenie, jak i zainicjalizowanie kursora – czyli jego
„otwarcie”. Kursor można zadeklarować jedynie wewnątrz istniejącego bloku transakcji, dlatego
przed jego zadeklarowaniem należy wykonać instrukcję BEGIN.
DECLARE nazwa_kursora [ BINARY ] [ INSENSITIVE ] [ [ NO] SCROLL ]
CURSOR
[ { WITH | WITHOUT } HOLD ]
FOR zapytanie;
nazwa_kursora – nazwa kursora, który ma być utworzony;
1
Bazy danych
EWSIE
28.11.2010
BINARY – opcjonalne słowo kluczowe, które powoduje, że uzyskany wynik ma format binarny
(standardowym formatem jest ASCII).
INSENSITIVE – zapewnia, że żadna z danych pobieranych z kursora nie będzie modyfikowana
przez inne kursory lub połączenia. Ponieważ w PostgreSQL lursory muszą być definiowane w
obrębie bloków transakcji, takie działanie jest domyślne.
[ NO ] SCROLL - pozwala na przemieszczanie się do tyłu (BACKWARD) po zbiorze kursora.
Zadeklarowanie kursora jako NO SCROLL blokuje przechodzenie po kursorze do tyłu. Jeżeli w
definicji kursora nie zostanie jawnie użyte ani SCROLL ani NO SCROLL, wówczas, jeżeli plan
zapytania jest prosty i niezbyt kosztowny, kursor będzie się zachowywał jakby użyto SCROLL i
pozwoli na przechodzenie po wierszach w obie strony. Może się jednak okazać, że tak
zadeklarowany kursor pozwoli jedynie na przechodzenie w kierunku FORWARD, a BACKWARD
będzie niedostępny.
WITH HOLD – pozwala na używanie kursora nawet wtedy, gdy transakcja, w której go utworzono,
zostanie pozytywnie zakończona (COMMIT).
WITHOUT HOLD – mówi, że kursor nie może być użyty poza obrębem transakcji, w której został
utworzony. Jest to domyślne działanie kursora, jeżeli ani WITH HOLD, ani WITHOUT HOLD nie
zostanie jawnie użyta.
UWAGA: Kursor z opcją HOLD jest zamykany albo w wyniku polecenia CLOSE nazwa_kursora,
albo z chwilą zakończenia sesji.
zapytanie - określa zapytanie do wykonania. Zestaw wyników tego zapytania będzie dostępny za
pośrednictwem kursora.
PRZYKŁAD 1
BEGIN;
DECLARE wszyscy_pracownicy CURSOR FOR SELECT * FROM pracownik;
W przykładzie 1 rozpoczęto blok transakcji, a następnie otwarto kursor zawierający wszystkie
informacje o pracownikach.
2
Bazy danych
EWSIE
28.11.2010
POBIERANIE DANYCH Z KURSORA
FETCH [ FORWARD | BACKWARD ]
[ # | ALL | NEXT | PRIOR ]
[ I N | FROM ] nazwa_kursora;
Kursor zawsze wskazuje na bieżącą pozycję w zestawie wyników wykonanej instrukcji. W celu
określenia kierunku „przesunięcia” kursora stosujemy słowa kluczowe:
FORWARD – w przód (działanie domyślne) lub
BACKWARD – w tył.
Następnie określa się liczbę zwracanych wierszy:
# - w postaci stałej całkowitej,
ALL – wszystkie wiersze,
NEXT – następny wiersz w stosunku do bieżącej pozycji kursora (działanie domyślne) lub
PRIOR – pojedynczy wiersz poprzedzający bieżącą pozycję kursora.
W przypadku słów kluczowych I N lub FROM, należy wybrać jedno z nich.
PRZYKŁAD 2
FETCH 4 FROM wszyscy_pracownicy;
FETCH NEXT FROM wszyscy_pracownicy;
FETCH PRIOR FROM wszyscy_pracownicy;
FETCH NEXT FROM wszyscy_pracownicy;
PRZESUWANIE POZYCJI KURSORA
Kursor utrzymuje pozycję w zestawie wyników skojarzonej z nim instrukcji SELECT. Aby
przemieścić go do określonej pozycji wiersza w określonym zestawie danych stosujemy polecenie:
MOVE [ FORWARD | BACKWARD ]
[ # | ALL | NEXT | PRIOR ]
[ I N | FROM ] nazwa_kursora;
PRZYKŁAD 3
MOVE FORWARD 10 IN wszyscy_pracownicy;
3
Bazy danych
EWSIE
28.11.2010
ZAMYKANIE KURSORA
CLOSE nazwa_kursora;
Kursor zostanie również zamknięty pośrednio, jeżeli blok transakcji, w którym kursor został
zdefiniowany, zostanie zatwierdzony za pomocą instrukcji COMMIT lub anulowany za pomocą
instrukcji ROLLBACK.
PRZYKŁAD 4
CLOSE wszyscy_pracownicy;
COMMIT;
4