Deklarowanie kursora

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

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

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

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

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.

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

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

BAZY DANYCH W APLIKACJACH SIECIOWYCH

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

Oracle PL/SQL. Paweł Rajba.

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

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

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

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

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

Technologie baz danych WYKŁAD 7: Wyjątki

PL/SQL. Zaawansowane tematy PL/SQL

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

PODSTAWY BAZ DANYCH 13. PL/SQL

Procedury i funkcje składowane

Oracle PL/SQL. Paweł Rajba.

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

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

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

Bloki anonimowe w PL/SQL

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

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

OBSŁUGA WYJĄTKÓW. Mechanizm języka PL/SQL. Wyjątki:

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

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

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

Cheatsheet PL/SQL Andrzej Klusiewicz 1/9

1. ELEMENTY JĘZYKA PL/SQL

DECLARE VARIABLE zmienna1 typ danych; BEGIN

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

Kursory. A. Pankowska 1

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

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

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

PL/SQL. Zaawansowane tematy PL/SQL. Piotr Medoń

Zaawansowane bazy danych i hurtownie danych semestr I

15. Funkcje i procedury składowane PL/SQL

1. Wyzwalacze BD (ang. triggers)

Pakiety podprogramów Dynamiczny SQL

Plan wykładu BAZY DANYCH II WYKŁAD 6. Co to są wyjątki? Co to są wyjątki?

Bloki anonimowe w PL/SQL

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

Język SQL. Rozdział 2. Proste zapytania

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

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

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

ORACLE (Wykład 1) aragorn.pb.bialystok.pl/~aonisko. Typy rozproszonych baz danych. Systemy klient-serwer. Klient-serwer: Przykład

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

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

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

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

Podprogramy. Rozdział 11 Procedury i funkcje składowane

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

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

Język PL/SQL Wprowadzenie

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

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

Paweł Rajba

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

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

PL/SQL. Część 1 Bloki PL/SQL. Piotr Medoń

Administracja i programowanie pod Microsoft SQL Server 2000

Język PL/SQL Wprowadzenie

Podstawowe właściwości języka PL/SQL

SQL (ang. Structured Query Language)

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

Tabele wykorzystywane w przykładach

SQL 4 Structured Query Lenguage

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

Delphi Laboratorium 3

PL/SQL co, gdzie i dlaczego?

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

Funkcje w PL/SQL Funkcja to nazwany blok języka PL/SQL. Jest przechowywana w bazie i musi zwracać wynik. Z reguły, funkcji utworzonych w PL/SQL-u

Używany kiedy pełna treść instrukcji SQL jest nieznana przed uruchomieniem programu.

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

Celem ćwiczenia jest wprowadzeniem do programowaniu w języku PL/SQL. Język PL/SQL umoŝliwia tworzenie programów, przetwarzających dane w bazie danych.

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

Zaawansowane bazy danych i hurtownie danych semestr I

Programowanie w SQL procedury i funkcje. UWAGA: Proszę nie zapominać o prefiksowaniu nazw obiektów ciągiem [OLIMP\{nr indeksu}] Funkcje użytkownika

Indeksy. Indeks typu B drzewo

Składowane procedury i funkcje

Ćwiczenia 2 IBM DB2 Data Studio

Wprowadzenie do języka SQL

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

41. Zmienne lokalne muszą mieć nazwę, którą poprzedza (maksymalnie 128 znaków) oraz typ (każdy z wyjątkiem: text, ntext oraz image)

Opis: Instrukcja warunkowa Składnia: IF [NOT] warunek [AND [NOT] warunek] [OR [NOT] warunek].

Oracle PL/SQL. Paweł Rajba.

Oracle PL/SQL. Paweł Rajba.

PL/SQL. Ćwicznia 2. Ćwiczenia 3

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

Optymalizacja poleceń SQL Wprowadzenie

Wyzwalacze TWORZENIE WYZWALACZY

Oracle PL/SQL. Paweł Rajba.

PHP może zostać rozszerzony o mechanizmy dostępu do różnych baz danych:

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

Transkrypt:

Kursory i wyjątki Kursory i praca z kursorami, kursory jawne i niejawne, otwieranie kursora, pobieranie z kursora, zamykanie kursora, wyjątki systemowe i użytkownika, zgłaszanie i obsługa wyjątków 1

Kursor 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 (result set). Wewnątrz kursora wyróżniamy bieżący wiersz (current row). Kursor może być jawny (explicit) lub niejawny (implicit). 2

Deklarowanie kursora DECLARE CURSOR nazwa [ ( lista parametrów) ] [ RETURN typ zwracany ] IS zapytanie SQL; parametr [ IN ] typ [ { := DEFAULT } wartość ] 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ń DECLARE CURSOR c_pracownicy (zespol NUMBER DEFAULT 10) IS SELECT nazwisko, etat, zatrudniony, placa_pod FROM pracownicy WHERE id_zesp = zespol; 3

Otwieranie kursora 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) ] DECLARE CURSOR c_prac (zespol NUMBER, posada VARCHAR2) IS SELECT * FROM pracownicy WHERE id_zesp = zespol AND etat = posada;... v_etat := PROFESOR ; OPEN c_prac(10, ASYSTENT ); OPEN c_prac(50, v_etat); 4

Pobieranie z 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. DECLARE 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; 5

Zamykanie kursora 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 zgłoszenie wyjątku INVALID_CURSOR. 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. 7

Atrybuty kursora niejawnego Każde polecenie DML (INSERT, UPDATE, DELETE, SELECT FOR UPDATE) powoduje utworzenie kursora niejawnego (ang. implicit cursor). Dla takiego kursora można sprawdzać wartości następujących atrybutów: 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) 8

Użycie kursora DECLARE 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); LOOP FETCH c_prac INTO v_nazwisko, v_etat; EXIT WHEN c_prac%notfound; DBMS_OUTPUT.PUT_LINE(v_nazwisko ', ' v_etat); END LOOP; CLOSE c_prac; 9

Pętla FOR z kursorem DECLARE CURSOR c (minplaca NUMBER) IS SELECT * FROM pracownicy WHERE placa_pod > minplaca; FOR c_rec IN c(800) LOOP DBMS_OUTPUT.PUT_LINE(c_rec.nazwisko ' zarabia ' c_rec.placa_pod ' i pracuje jako ' c_rec.etat); END LOOP; 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 10

Pętla FOR z podzapytaniem FOR c_rec IN ( SELECT * FROM pracownicy ) LOOP END LOOP; 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 11

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) DECLARE CURSOR c IS SELECT * FROM pracownicy JOIN zespoly USING (id_zesp) FOR UPDATE OF placa_pod; FOR c_rec IN c LOOP IF (c_rec.adres = 'PIOTROWO 3A') THEN END IF; END LOOP; UPDATE pracownicy SET placa_pod = 1.1 * placa_pod WHERE CURRENT OF c; 12

Obsługa wyjątków w PL/SQL Błąd lub ostrzeżenie nazywamy w PL/SQL wyjątkiem (ang. exception). Wyjątki mogą być systemowe (dzielenie przez zero, brak wolnej pamięci, brak praw do obiektu) lub definiowane przez użytkownika (za niski budżet, za wysoka płaca, zbyt mała ilość towaru w magazynie). Wystąpienie błędu jest sygnalizowane przez wywołanie wyjątku. Błędy systemowe sygnalizowane są automatycznie, błędy definiowane przez użytkownika są wywoływane ręcznie za pomocą polecenia RAISE. Po wystąpieniu wyjątku kontrola przechodzi do procedury obsługi wyjątku (ang. exception handler). Po jej wykonaniu kontrola przechodzi do kolejnego bloku nadrzędnego. Jeśli procedura obsługi danego błędu nie zostanie znaleziona, to wykonywanie programu zostanie przerwane. 13

Struktura sekcji EXCEPTION Sekwencja poleceń i zostaje wykonana, gdy w bloku wystąpi wyjątek i. Nieobsłużony wyjątek przerywa działanie programu. Opcjonalna sekcja OTHERS obsługuje wszystkie niewymienione wcześniej wyjątki. DECLARE...... EXCEPTION WHEN <nazwa wyjątku 1> THEN sekwencja poleceń 1 WHEN <nazwa wyjątku 2> THEN sekwencja poleceń 2... WHEN OTHERS THEN sekwencja poleceń n 14

Propagacja obsługi wyjątku RAISE A; RAISE B; RAISE C; EXCEPTION WHEN A THEN EXCEPTION WHEN A THEN EXCEPTION WHEN A THEN EXCEPTION WHEN B THEN EXCEPTION WHEN B THEN EXCEPTION WHEN B THEN BŁĄD 15

Predefiniowane wyjątki systemowe Exception Oracle Error SQLCODE Value CURSOR_ALREADY_OPEN ORA-06511-6511 DUP_VAL_ON_INDEX ORA-00001-1 INVALID_CURSOR ORA-01001-1001 INVALID_NUMBER ORA-01722-1722 LOGIN_DENIED ORA-01017-1017 NO_DATA_FOUND ORA-01403 100 NOT_LOGGED_ON ORA-01012-1012 PROGRAM_ERROR ORA-06501-6501 STORAGE_ERROR ORA-06500-6500 TIMEOUT_ON_RESOURCE ORA-00051-51 TOO_MANY_ROWS ORA-01422-1422 VALUE_ERROR ORA-06502-6502 ZERO_DIVIDE ORA-01476-1476 16

Obsługa predefiniowanych wyjątków DECLARE v_nazwisko pracownicy.nazwisko%type; SELECT nazwisko INTO v_nazwisko FROM pracownicy WHERE id_zesp = 10; dbms_output.put_line(' W zespole 10 pracuje ' EXCEPTION v_nazwisko); WHEN no_data_found THEN dbms_output.put_line('brak pracowników w zespole 10!'); WHEN too_many_rows THEN dbms_output.put_line('więcej pracowników w zespole 10!'); WHEN OTHERS THEN dbms_output.put_line('wystąpił inny błąd'); 17

Definiowanie własnych wyjątków DECLARE v_liczba NUMBER := 0; ex_moj_wyjatek EXCEPTION;... Wyjątki mogą być deklarowane w sekcji deklaracji dowolnych bloków PL/SQL. Przed użyciem wyjątku musi on być zadeklarowany. Wyjątek jest widoczny w danym bloku i wszystkich jego blokach podrzędnych. Wyjątek nie jest daną, do wyjątku nie można przypisać żadnej wartości ani użyć wyjątku w jakiejkolwiek operacji arytmetycznej. 18

Wywoływanie własnych wyjątków Użytkownik może wywoływać ręcznie zarówno błędy systemowe, jak i zdefiniowane przez siebie. Każdy wywołany błąd powinien zostać obsłużony przez odpowiednią procedurę obsługi wyjątku. DECLARE v_liczba NUMBER := 0; v_zespol NUMBER := &zespol; ex_za_malo_pracownikow EXCEPTION; SELECT COUNT(*) INTO v_liczba FROM pracownicy WHERE id_zesp = v_zespol; IF (v_liczba < 3) THEN RAISE ex_za_malo_pracownikow; END IF; EXCEPTION WHEN ex_za_malo_pracownikow THEN DBMS_OUTPUT.PUT_LINE('Brak ludzi w zespole ' v_zespol'); 19

Funkcje SQLCODE i SQLERRM Funkcja SQLCODE zwraca numer błędu, który wystąpił. Numer jest zawsze ujemny, za wyjątkiem błędu NO_DATA_FOUND (+100) i błędów definiowanych przez użytkownika (+1) Funkcja SQLERRM zwraca treść błędu, który wystąpił. Jeśli nie wystąpił żaden błąd to SQLCODE zwraca 0 a SQLERRM zwraca : ORA-0000: normal, successful completion DECLARE... EXCEPTION... err_num NUMBER; err_msg VARCHAR2(100); WHEN OTHERS THEN err_num := SQLCODE; err_msg := SUBSTR(SQLERRM, 1, 200); INSERT INTO errors VALUES (err_num, err_msg); 20

Procedura RAISE_APPLICATION_ERROR Procedura pozwala na przesyłanie komunikatów o błędach zdefiniowanych przez użytkownika do programu nadrzędnego. RAISE_APPLICATION_ERROR(error_number, message, [, TRUE FALSE ] ) error_numer: liczba ujemna z przedziału 20000-20999 message: łańcuch znaków o rozmiarze do 2048 bajtów TRUE, FALSE: czy błąd ma być umieszczony na szczycie stosu błędów, czy też ma je zastąpić FOR prac_record IN ( SELECT * FROM PRACOWNICY ) LOOP IF ( prac_record.placa_pod < 300 ) THEN ELSE RAISE_APPLICATION_ERROR(-20010, 'Uwaga, za niskie pensje pracowników'); DBMS_OUTPUT.PUT_LINE('Płaca pracownika: ' prac_record.placa_pod); END IF; END LOOP; 21