lab 28 11 10

background image

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

background image

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

background image

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

background image

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


Wyszukiwarka

Podobne podstrony:
lab 28 11 10
wykład 11 10 28 cz2
wykład 11 10 28 cz1
lab 11 5 10
LAB 1 11 10
28 9 11
fonetyka 05 11 10
2010.11.10 Ekonomika Turystyki i Rekreacji rynek tur, AWF
Podstawy geografii fizycznej z elementami astronomii  11 10
28 11
KPF w Neurologii cw (11 10 10)
5 11 10
Analiza Wykład 6 (16 11 10) ogarnijtemat com
#12 Wykłąd o śnieniu 28 11 1993
28 7 11

więcej podobnych podstron