Kursor. Rozdział 10a Kursory. Otwieranie kursora. Deklarowanie kursora

Podobne dokumenty
Język PL/SQL. Rozdział 2. Kursory

Kursor jawny. Rozdział 10a Kursory. Deklarowanie kursora (1) Deklarowanie kursora (2)

Kursory i wyjątki. (c) Instytut Informatyki Politechniki Poznańskiej 1

Deklarowanie kursora

Oracle PL/SQL. Paweł Rajba.

Materiały. Technologie baz danych. Plan wykładu Kursory. Wykład 5: Kursory jawne. Podprogramy. Kursory jawne. Kursory niejawne

Deklarowanie kursora. CURSOR nazwa [ ( param1 typ1 [,param2 typ2]... ) ] [RETURN typ zwracany] IS zapytanie SQL;

Plan wykładu BAZY DANYCH II WYKŁAD 4. Co to jest kursor? Rodzaje kursorów

DECLARE <nazwa_zmiennej> typ [(<rozmiar> )] [ NOT NULL ] [ { := DEFAULT } <wartość> ];

1 Kursory 1. 2 Wyjątki Wyjątki predefiniowane Wyjątki niezdefiniowane wcześniej Definiowanie własnych wyjątków...

Procedury i funkcje składowane

Bazy danych wykład dwunasty PL/SQL, c.d. Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, wykładwarszawa)

PL/SQL. Zaawansowane tematy PL/SQL

PODSTAWY BAZ DANYCH 13. PL/SQL

Kursory - pobieranie danych z baz danych do programów PL/SQL

Plan wykładu Projekt fizyczny bazy danych Wprowadzenie PL/SQL PL/SQL Cechy PL/SQL

Plan wykładu PL/SQL. PL/SQL - historia TWORZENIE APLIKACJI BAZODANOWYCH

Kursory. A. Pankowska 1

Język PL/SQL Procedury i funkcje składowane

Programowanie w SQL. definicja bloku instrukcji BEGIN...END, warunkowe wykonanie instrukcji IF...ELSE, wyrażenie CASE,

Plan wykładu BAZY DANYCH II WYKŁAD 3. Zasięg zmiennych. Zasięg zmiennych

Język SQL. Rozdział 8. Język manipulowania danymi DML

Październik Instytut Informatyki Teoretycznej i Stosowanej Politechnika Częstochowska. Systemy baz danych - wykład III. dr inż.

Język PL/SQL. Rozdział 5. Pakiety podprogramów. Dynamiczny SQL

Procedury wyzwalane. (c) Instytut Informatyki Politechniki Poznańskiej 1

1. ELEMENTY JĘZYKA PL/SQL

Wprowadzenie do języka PL/SQL. Rozdział 9 Język PL/SQL Wprowadzenie. Struktura blokowa programu. Przykładowy program w PL/SQL

Język PL/SQL. Rozdział 1. Wprowadzenie do języka PL/SQL

Język SQL. Rozdział 6. Podzapytania Podzapytania proste i skorelowane, podzapytania w klauzuli SELECT i FROM, operatory ANY, ALL i EXISTS.

Kolekcje Zbiory obiektów, rodzaje: tablica o zmiennym rozmiarze (ang. varray) (1) (2) (3) (4) (5) Rozszerzenie obiektowe w SZBD Oracle

Język PL/SQL Wprowadzenie

Podzapytania. Rozdział 5. Podzapytania. Podzapytania wyznaczające wiele krotek (1) Podzapytania wyznaczające jedną krotkę

Język PL/SQL Wprowadzenie

Bloki anonimowe w PL/SQL

Podzapytania. Rozdział 5. Podzapytania. Podzapytania wyznaczające wiele krotek (1) Podzapytania wyznaczające jedną krotkę

Podzapytania. Rozdział 5. Podzapytania. Podzapytania wyznaczające wiele krotek (1) Podzapytania wyznaczające jedną krotkę

Zaawansowane bazy danych i hurtownie danych semestr I

Język SQL. Rozdział 8. Język manipulowania danymi DML zadania

Język PL/SQL. Rozdział 3. Obsługa błędów wykonania Wyjątki predefiniowane i użytkownika, zgłaszanie i obsługa wyjątków.

Język SQL. Rozdział 5. Połączenia i operatory zbiorowe

Bloki anonimowe w PL/SQL

Ćwiczenie 12 PL/SQL. Język PL/SQL kursory i wyjątki

Język SQL. Rozdział 2. Proste zapytania

Wyzwalacz - procedura wyzwalana, składowana fizycznie w bazie, uruchamiana automatycznie po nastąpieniu określonego w definicji zdarzenia

w PL/SQL bloki nazwane to: funkcje, procedury, pakiety, wyzwalacze

Wprowadzenie do języka SQL

Język PL/SQL. Rozdział 6. Procedury wyzwalane

Wprowadzenie do języka PL/SQL. Rozdział 9 Język PL/SQL Wprowadzenie. Struktura blokowa programu. Przykładowy program w PL/SQL

Język SQL. Rozdział 4. Funkcje grupowe Funkcje grupowe, podział relacji na grupy, klauzule GROUP BY i HAVING.

Procedury wyzwalane. Rozdział 13. Procedury wyzwalane. Cele stosowania procedur wyzwalanych. Definiowanie procedury wyzwalanej DML

Język SQL. Rozdział 7. Zaawansowane mechanizmy w zapytaniach

Podprogramy. Rozdział 11 Procedury i funkcje składowane

Oracle Developer Suite. Budowa aplikacji użytkownika końcowego

Język PL/SQL. Rozdział 4. Procedury i funkcje składowane

Oracle PL/SQL. Paweł Rajba.

Pakiety podprogramów Dynamiczny SQL

Język SQL. Rozdział 10. Perspektywy Stosowanie perspektyw, tworzenie perspektyw prostych i złożonych, perspektywy modyfikowalne i niemodyfikowalne.

Paweł Rajba

Ćwiczenie rozpocznie się od wprowadzenia do laboratorium, po którym omówimy składnię ę polecenia INSERT pozwalającego ą na wstawianie krotek do

PL/SQL. Lidia Małkiewicz i Cezary Skubała

Administracja i programowanie pod Microsoft SQL Server 2000

Cheatsheet PL/SQL Andrzej Klusiewicz 1/9

SQL do zaawansowanych analiz danych część 1.

Oracle PL/SQL. Paweł Rajba.

Plan wykładu BAZY DANYCH II WYKŁAD 5. Kolekcje. Tablice asocjacyjne Kolekcje Tablice asocjacyjne VARRAY Tablice zagnieżdżone

Klasyczna Analiza Danych

Obiektowe bazy danych Ćwiczenia laboratoryjne (?)

Język SQL. Rozdział 9. Język definiowania danych DDL, część 2.

Wprowadzenie do języka PL/SQL. Język PL/SQL Wprowadzenie. Struktura blokowa programu. Przykładowy program w PL/SQL. Zmienne rekordowe.

SQL 4 Structured Query Lenguage

KOLEKCJE - to typy masowe,zawierające pewną liczbę jednorodnych elementów

Wymagania: Konstrukcja prostych zapytań w języku SQL, umiejętność wykorzystania funkcji wierszowych i agregujących.

Optymalizacja poleceń SQL Wprowadzenie

Optymalizacja poleceń SQL Metody dostępu do danych

1. Wyzwalacze BD (ang. triggers)

Systemy GIS Tworzenie zapytań w bazach danych

Zarządzanie bazą danych. Bazy Danych i Systemy informacyjne Wykład 4. Piotr Syga

15. Funkcje i procedury składowane PL/SQL

Perspektywy Stosowanie perspektyw, tworzenie perspektyw prostych i złożonych, perspektywy modyfikowalne i niemodyfikowalne, perspektywy wbudowane.

DECLARE VARIABLE zmienna1 typ danych; BEGIN

Procedury składowane. Funkcje vs. procedury Funkcja. Procedura. zazwyczaj ma parametry tylko typu IN; można wywoływać z poziomu

Pakiety są logicznymi zbiorami obiektów takich jak podprogramy, typy, zmienne, kursory, wyjątki.

SQL (ang. Structured Query Language)

Plan wykładu BAZY DANYCH II WYKŁAD 2. Bloki. Struktura bloku

Bazy Danych i Usługi Sieciowe

Oracle PL/SQL. Paweł Rajba.

Laboratorium nr 4. Temat: SQL część II. Polecenia DML

1 Wprowadzenie do bloków nazwanych 1. 2 Parametry 2. 3 Procedury i funkcje 3. 4 Pakiety 6. 5 Podsumowanie Źródła 10

ACESS- zadania z wykorzystaniem poleceń SQL

Języki programowania wysokiego poziomu. PHP cz.4. Bazy danych

P o d s t a w y j ę z y k a S Q L

Ćwiczenie 11 PL/SQL. Wprowadzenie do języka PL/SQL

2 PL/SQL - podstawy Zmienne i stałe Operatory SQL w PL/SQL Instrukcje sterujące... 8

Wyzwalacze TWORZENIE WYZWALACZY

Język DML. Instrukcje DML w różnych implementacjach SQL są bardzo podobne. Podstawowymi instrukcjami DML są: SELECT INSERT UPDATE DELETE

11 marca Instytut Informatyki Teoretycznej i Stosowanej Politechnika Częstochowska. Systemy baz danych - wykład III. dr inż.

1: 2: 3: 4: 5: 6: 7: 8: 9: 10:

Ćwiczenie zapytań języka bazy danych PostgreSQL

Bazy danych i usługi sieciowe

1 DML - zapytania, część II Grupowanie Operatory zbiorowe DML - modyfikacja 7. 3 DCL - sterowanie danymi 9.

Transkrypt:

Kursor Rozdział 10a Kursory Kursory i praca z kursorami, kursory jawne i niejawne, otwieranie kursora, pobieranie z kursora, zamykanie kursora, zmienne kursorowe, wyrażenie CURSOR Każde zapytanie SQL umieszczone w programie PL/SQL może zwrócić zero, jedną bądź wiele krotek. Aby efektywnie przetworzyć krotki zwrócone przez zapytanie korzystamy z kursorów. Kursor jest obiektem związanym z zapytaniem. Programista może: Otworzyć kursor (zidentyfikować zbiór wynikowy). Pobrać daną do kursora (odczytać kolejną krotkę z wyniku zapytania i wpisać ją do kursora). Zamknąć kursor (zwolnić obszar pamięci przydzielony kursorowi). Kursor to nazwa obszaru roboczego, w którym mieści się wynik zapytania (ang. result set). Wewnątrz kursora wyróżniamy bieżący wiersz (ang. current row). Kursor może być jawny (ang. explicit) lub niejawny (ang. implicit). 1 2 Deklarowanie kursora Otwieranie kursora CURSOR nazwa [ ( lista parametrów) ] [ RETURN typ zwracany ] IS zapytanie SQL; parametr [ IN ] typ [ { := DEFAULT } wartość ] Otwarcie kursora powoduje wykonanie związanego z nim zapytania i zidentyfikowanie zbioru wynikowego, zawierającego krotki spełniające kryteria wyszukiwania. OPEN nazwa_kursora [ (lista parametrów aktualnych) ] Nazwa kursora nie jest zmienną, lecz identyfikatorem. Do kursora nie można przypisać wartości. Parametry są widoczne tylko wewnątrz kursora, nie można związać z nimi żadnych ograniczeń. CURSOR c_pracownicy (p_zespol NUMBER DEFAULT 10) IS SELECT nazwisko, etat, zatrudniony, placa_pod FROM pracownicy WHERE id_zesp = p_zespol; CURSOR c_prac (p_zespol NUMBER, p_posada VARCHAR2) IS SELECT * FROM pracownicy WHERE id_zesp = p_zespol AND etat = p_posada; v_etat := PROFESOR ; OPEN c_prac(10, ASYSTENT ); OPEN c_prac(50, v_etat); 3 4

Pobieranie z kursora Zamykanie kursora FETCH nazwa_kursora INTO lista zmiennych rekord; Każde wykonanie polecenia FETCH powoduje odczytanie bieżącego wiersza kursora i przesunięcie znacznika kursora na kolejny wiersz. Na liście zmiennych musi się znajdować taka sama liczba zmiennych jak liczba atrybutów w kursorze. Odpowiednie zmienne i atrybuty muszą się zgadzać co do typu. CURSOR c_prac IS SELECT nazwisko, etat FROM pracownicy; v_nazwisko PRACOWNICY.NAZWISKO%TYPE; v_etat PRACOWNICY.ETAT%TYPE; OPEN c_prac; FETCH c_prac INTO v_nazwisko, v_etat; CLOSE nazwa_kursora; Zamknięcie kursora powoduje, że kursor staje się nieaktywny a zbiór wynikowy związany z kursorem staje się niezdefiniowany. Zamknięty kursor można powtórnie otworzyć, np. z innymi parametrami. Każde odwołanie się do zamkniętego (lub jeszcze nie otwartego) kursora powoduje błąd INVALID_CURSOR. 5 6 Atrybuty kursora %FOUND wartością atrybutu jest TRUE jeśli ostatnia operacja FETCH odczytała krotkę z kursora. W przeciwnym wypadku (tzn. kiedy odczyt się nie udał) atrybut przyjmuje wartość FALSE. Przed pierwszym odczytem atrybut ma wartość NULL %NOTFOUND wartością atrybutu jest FALSE jeśli ostatnia operacja FETCH odczytała krotkę z kursora. W przeciwnym wypadku (tzn. kiedy odczyt się nie udał) atrybut przyjmuje wartość TRUE. Przed pierwszym odczytem atrybut ma wartość NULL %ROWCOUNT wartością atrybutu jest liczba odczytanych z kursora krotek. Przed pierwszym odczytem atrybut ma wartość 0 %ISOPEN wartością atrybutu jest TRUE jeśli kursor jest otwarty i FALSE jeśli kursor jest zamknięty. Użycie kursora CURSOR c_prac (zespol NUMBER DEFAULT 10) IS SELECT nazwisko, etat FROM pracownicy WHERE id_zesp = zespol ORDER BY placa_pod DESC; v_nazwisko PRACOWNICY.NAZWISKO%TYPE; v_etat PRACOWNICY.ETAT%TYPE; OPEN c_prac(30); FETCH c_prac INTO v_nazwisko, v_etat; EXIT WHEN c_prac%notfound; DBMS_OUTPUT.PUT_LINE(v_nazwisko ', ' v_etat); CLOSE c_prac; 7 8

Pętla FOR z kursorem Pętla FOR z podzapytaniem CURSOR c (minplaca NUMBER) IS SELECT * FROM pracownicy WHERE placa_pod > minplaca; FOR c_rec IN c(800) DBMS_OUTPUT.PUT_LINE(c_rec.nazwisko ' zarabia ' c_rec.placa_pod ' i pracuje jako ' c_rec.etat); Zmienna sterująca pętlą jest deklarowana automatycznie jako zmienna typu kursor%rowtype Kursor jest otwierany automatycznie W każdym przebiegu pętli jedna krotka jest pobierana z kursora i umieszczana w zmiennej sterującej pętlą Po pobraniu ostatniej krotki kursor jest automatycznie zamykany FOR c_rec IN ( SELECT * FROM pracownicy ) DBMS_OUTPUT.PUT_LINE(c_rec.nazwisko ' zarabia ' c_rec.placa_pod ' i pracuje jako ' c_rec.etat); Zmienna sterująca pętlą jest deklarowana automatycznie jako zmienna typu podzapytanie%rowtype Kursor jest otwierany automatycznie W każdym przebiegu pętli jedna krotka jest pobierana z kursora i umieszczana w zmiennej sterującej pętlą Po pobraniu ostatniej krotki kursor jest automatycznie zamykany Kursor oparty na podzapytaniu nie może być parametryzowany ani wykorzystywany wielokrotnie 9 10 Klauzula WHERE CURRENT OF Klauzula WHERE CURRENT OF ma zastosowanie do poleceń UPDATE i DELETE umieszczonych wewnątrz kursora. Warunek jest spełniony tylko i wyłącznie dla bieżącej krotki w kursorze. Aby można było skorzystać z tej klauzuli, zapytanie definiujące kursor musi zawierać klauzulę FOR UPDATE OF (założenie blokady na odczytywanych krotkach) CURSOR c IS SELECT * FROM pracownicy JOIN zespoly USING (id_zesp) FOR UPDATE OF placa_pod; FOR c_rec IN c IF (c_rec.adres = 'PIOTROWO 3A') THEN UPDATE pracownicy SET placa_pod = 1.1 * placa_pod WHERE CURRENT OF c; END IF; Zmienna kursorowa Jest referencją do obiektu reprezentującego kursor lub zapytanie, nie jest kursorem! Pozwala na użycie kursora udostępniającego różne zbiory rekordów. Rodzaje zmiennych kursorowych: z określoną strukturą rekordu zmienna kursorowa silnie typowana, bez określonej struktury rekordu zmienna kursorowa słabo typowana. Proces deklarowanie zmiennej kursorowej: 1. zadeklarowanie typu REF CURSOR, TYPE nazwa_typu IS REF CURSOR [RETURN definicja_rekordu]; 2. zadeklarowanie właściwej zmiennej za pomocą typu z p. 1. nazwa_zmiennej_kursorowej nazwa_typu; 11 12

Zmienna kursorowa silnie typowana TYPE tpracownik IS REF CURSOR RETURN pracownicy%rowtype; v_zmienna_kur tpracownik; r_pracownik pracownicy%rowtype; OPEN v_zmienna_kur FOR SELECT * FROM pracownicy WHERE etat = 'PROFESOR'; FETCH v_zmienna_kur INTO r_pracownik; DBMS_OUTPUT.PUT_LINE (r_pracownik.nazwisko); Zmienna kursorowa słabo typowana TYPE tkursor IS REF CURSOR; v_zmienna_kur tkursor; r_pracownik pracownicy%rowtype; r_zespol zespoly%rowtype; OPEN v_zmienna_kur FOR SELECT * FROM pracownicy; FETCH v_zmienna_kur INTO r_pracownik; DBMS_OUTPUT.PUT_LINE (r_pracownik.nazwisko); OPEN v_zmienna_kur FOR SELECT * FROM zespoly; OPEN v_zmienna_kur FOR SELECT * FROM pracownicy WHERE etat = 'ADIUNKT'; FETCH v_zmienna_kur INTO r_zespol; DBMS_OUTPUT.PUT_LINE (r_zespol.nazwa); 13 14 Wyrażenie CURSOR Wyrażenie CURSOR w poleceniu SQL Pozwala na zdefiniowane kursora zagnieżdżonego w zapytaniu. Używane zarówno w poleceniach SQL jak i programach PL/SQL. Składnia: SELECT, CURSOR(zapytanie) FROM SQL> SELECT nazwa, CURSOR(SELECT nazwisko, placa_pod FROM pracownicy p WHERE id_zesp = z.id_zesp ORDER BY nazwisko) AS pracownik FROM zespoly z ORDER BY nazwa; Zasady stosowania: tylko dla kursorów jawnych, kursor obsługujący zagnieżdżone zapytanie jest otwierany i zamykany automatycznie, dopuszczalne wielopoziomowe zagnieżdżanie wyrażenia. NAZWA PRACOWNIK -------------------- -------------------- ADMINISTRACJA NAZWISKO PLACA_POD --------------- ---------- MAREK 410,2 WEGLARZ 1730 ALGORYTMY NAZWISKO PLACA_POD --------------- ---------- BLAZEWICZ 1350 BADANIA OPERACYJNE nie wybrano żadnych wierszy 15 16

Wyrażenie CURSOR w PL/SQL TYPE tkursor IS REF CURSOR; CURSOR cwszystko IS SELECT nazwa, CURSOR(SELECT nazwisko FROM pracownicy p WHERE id_zesp = z.id_zesp ORDER BY nazwisko) AS pracownik FROM zespoly z ORDER BY nazwa; v_pracownicy tkursor; v_nazwa zespoly.nazwa%type; v_nazwisko pracownicy.nazwisko%type; OPEN cwszystko; FETCH cwszystko INTO v_nazwa, v_pracownicy; EXIT WHEN cwszystko %NOTFOUND; DBMS_OUTPUT.PUT_LINE ('Zespół: ' v_nazwa); -- brak OPEN FETCH v_pracownicy INTO v_nazwisko; EXIT WHEN v_pracownicy%notfound; DBMS_OUTPUT.PUT_LINE(v_pracownicy%ROWCOUNT ' ' v_nazwisko); -- brak CLOSE CLOSE cwszystko; Kursor niejawny Każde polecenie DML (INSERT, UPDATE, DELETE, SELECT FOR UPDATE) powoduje utworzenie kursora niejawnego (ang. implicit cursor). Atrybuty kursora niejawnego pozwalają na sprawdzenie statusu ostatnio wykonanegopolecenia DML: SQL%ROWCOUNT: liczba wierszy zmodyfikowanych przez polecenie SQL%FOUND: TRUE jeśli ostatnie polecenie zmodyfikowało jakiekolwiek wiersze SQL%NOTFOUND: TRUE jeśli ostatnie polecenie nie zmodyfikowało żadnych wierszy SQL%ISOPEN: zawsze FALSE (kursor niejawny jest zamykany natychmiast po zakończeniu polecenia) 17 18 Użycie kursora niejawnego INSERT INTO zespoly VALUES(zesp_seq.nextval, 'EKSPERYMENTALNY', null); if SQL%FOUND then dbms_output.put_line('zdefiniowano rekord!'); else dbms_output.put_line('niepowodzenie definicji rekordu'); end if; DELETE pracownicy WHERE id_zesp in (SELECT id_zesp from zespoly WHERE nazwa = 'TESTOWY'); dbms_output.put_line('liczba usuniętych rekordów: ' to_char(sql%rowcount)); 19