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

Podobne dokumenty
Deklarowanie kursora

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ść> ];

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

BAZY DANYCH W APLIKACJACH SIECIOWYCH

Oracle PL/SQL. Paweł Rajba.

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

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

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

Technologie baz danych WYKŁAD 7: Wyjątki

Procedury i funkcje składowane

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

PODSTAWY BAZ DANYCH 13. PL/SQL

PL/SQL. Zaawansowane tematy PL/SQL

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

Oracle PL/SQL. Paweł Rajba.

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

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

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

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

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

Bloki anonimowe w PL/SQL

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

Kursory. A. Pankowska 1

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

Cheatsheet PL/SQL Andrzej Klusiewicz 1/9

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

DECLARE VARIABLE zmienna1 typ danych; BEGIN

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

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

1. ELEMENTY JĘZYKA PL/SQL

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

Zaawansowane bazy danych i hurtownie danych semestr I

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

Pakiety podprogramów Dynamiczny SQL

15. Funkcje i procedury składowane PL/SQL

1. Wyzwalacze BD (ang. triggers)

Bloki anonimowe w PL/SQL

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

Język SQL. Rozdział 2. Proste zapytania

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

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

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

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

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

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

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

Podprogramy. Rozdział 11 Procedury i funkcje składowane

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

Paweł Rajba

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

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

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

PL/SQL co, gdzie i dlaczego?

Administracja i programowanie pod Microsoft SQL Server 2000

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

SQL 4 Structured Query Lenguage

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

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

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

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

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

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

Język PL/SQL Wprowadzenie

Tabele wykorzystywane w przykładach

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

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

SQL (ang. Structured Query Language)

Ćwiczenia 2 IBM DB2 Data Studio

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

Język PL/SQL Wprowadzenie

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

Składowane procedury i funkcje

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

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

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

Wprowadzenie do języka SQL

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

Oracle PL/SQL. Paweł Rajba.

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

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.

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

Bazy danych 11. SQL Procedury składowane, kursory i wyzwalacze

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

Indeksy. Indeks typu B drzewo

SQL do zaawansowanych analiz danych część 1.

Optymalizacja poleceń SQL Wprowadzenie

Delphi Laboratorium 3

Oracle PL/SQL. Paweł Rajba.

Sprawdzenie poziomu izolacji transakcji (w aktualnym połączeniu):

Systemy GIS Tworzenie zapytań w bazach danych

Język PL/SQL Pakiety podprogramów

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

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

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 lista parametrów) ]] [[ RETURN typ typ zwracany ]] IS IS zapytanie SQL; parametr [[ IN IN ]] typ 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) 10) IS IS SELECT nazwisko, etat, 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 IS SELECT ** FROM pracownicy WHERE id_zesp = zespol AND etat etat = posada; BEGIN...... v_etat := := PROFESOR ; OPEN c_prac(10, ASYSTENT ); OPEN c_prac(50, v_etat); 4

Pobieranie z kursora FETCH nazwa_kursora INTO lista 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 c_prac IS IS SELECT nazwisko, etat etat FROM FROM pracownicy; v_nazwisko PRACOWNICY.NAZWISKO%TYPE; v_etat v_etat PRACOWNICY.ETAT%TYPE; OPEN OPEN c_prac; FETCH c_prac c_prac INTO INTO v_nazwisko, v_etat; 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 błąd 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 FLASE 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) 10) IS IS SELECT nazwisko, etat etat FROM pracownicy WHERE id_zesp = zespol ORDER BY BY placa_pod DESC; v_nazwisko PRACOWNICY.NAZWISKO%TYPE; v_etat PRACOWNICY.ETAT%TYPE; BEGIN 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; END; 9

Pętla FOR z kursorem DECLARE CURSOR c (minplaca NUMBER) IS IS SELECT ** FROM FROM pracownicy WHERE placa_pod > minplaca; FOR FOR c_rec c_rec IN IN c(800) c(800) LOOP LOOP DBMS_OUTPUT.PUT_LINE(c_rec.nazwisko '' zarabia '' c_rec.placa_pod '' i i pracuje jako jako '' c_rec.etat); END END LOOP; 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 FOR c_rec c_rec IN IN (( SELECT ** FROM FROM pracownicy )) LOOP LOOP DBMS_OUTPUT.PUT_LINE(c_rec.nazwisko '' zarabia '' c_rec.placa_pod '' i i pracuje jako jako '' c_rec.etat); END END LOOP; LOOP; 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 IS SELECT ** FROM FROM pracownicy JOIN JOIN zespoly USING USING (id_zesp) FOR FOR UPDATE OF OF placa_pod; FOR FOR c_rec c_rec IN IN c LOOP LOOP IF IF (c_rec.adres = 'PIOTROWO 3A') 3A') THEN THEN UPDATE pracownicy SET SET placa_pod = 1.1 1.1 ** placa_pod WHERE CURRENT OF OF c; c; END END IF; IF; END END LOOP; LOOP; 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

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

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 15

Definiowanie własnych wyjątków DECLARE v_liczba NUMBER := := 0; 0; ex_moj_wyjatek EXCEPTION;...... Wyjątki mogą być deklarowane w blokach 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. 16

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; 0; v_zespol NUMBER := :=&zespol; ex_za_malo_pracownikow EXCEPTION; SELECT COUNT(*) INTO INTO v_liczba FROM FROM pracownicy WHERE id_zesp = v_zespol; IF IF (v_liczba < 3) 3) THEN THEN RAISE RAISE ex_za_malo_pracownikow; END END IF; IF; EXCEPTION WHEN WHEN ex_za_malo_pracownikow THEN THEN DBMS_OUTPUT.PUT_LINE('W zespole '' v_zespol '' brakuje ludzi!'); 17

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 DECLARE err_num err_numnumber; err_msg err_msgvarchar2(100);...... EXCEPTION EXCEPTION...... WHEN WHEN OTHERS OTHERS THEN THEN err_num err_num := := SQLCODE; SQLCODE; err_msg err_msg := := SUBSTR(SQLERRM, SUBSTR(SQLERRM, 1, 1, 200); 200); INSERT INSERT INTO INTOerrors errorsvalues (err_num, (err_num, err_msg); err_msg); 18

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, message, [[,, TRUE TRUE FALSE 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 FOR prac_record prac_record IN IN (( SELECT SELECT ** FROM FROM PRACOWNICY PRACOWNICY )) LOOP LOOP IF IF (( prac_record.placa_pod < 300 300 )) THEN THEN RAISE_APPLICATION_ERROR(-20010, 'Uwaga, 'Uwaga, za za niskie niskie pensje pensje pracowników'); pracowników'); ELSE ELSE DBMS_OUTPUT.PUT_LINE('Płaca pracownika: pracownika: ' ' prac_record.placa_pod); END END IF; IF; END END LOOP; LOOP; 19