Systemy baz danych wykład IV dr inż. Robert Perliński Kursory Systemy baz danych - wykład IV Wyjątki Wyjątki predefiniowane Wyjątki niezdefiniowane wcześniej Definiowanie własnych wyjątków Podsumowanie dr inż. Robert Perliński Instytut Informatyki Teoretycznej i Stosowanej Politechnika Częstochowska Źródła Systemy baz danych - wykład IV 11 marca 2017 1/34 Plan wykładu Systemy baz danych wykład IV dr inż. Robert Perliński Kursory Wyjątki Wyjątki predefiniowane Wyjątki niezdefiniowane wcześniej 1 Kursory 2 Wyjątki Wyjątki predefiniowane Wyjątki niezdefiniowane wcześniej Definiowanie własnych wyjątków Definiowanie własnych wyjątków Podsumowanie 3 Podsumowanie Źródła 4 Źródła Systemy baz danych - wykład IV 2/34 Kursor Systemy baz danych wykład IV dr inż. Robert Perliński Kursory Wyjątki Wyjątki predefiniowane Wyjątki niezdefiniowane wcześniej Definiowanie własnych wyjątków Kursor - posiadający nazwę wskaźnik do prywatnej przestrzeni roboczej pozwalającej składować i udostępniać wynik zapytania SELECT albo zapytań DML manipulujących na danych (INSERT, UPDATE, DELETE albo MERGE). Podsumowanie Źródła Systemy baz danych - wykład IV 3/34 Rodzaje kursorów Systemy baz danych wykład IV dr inż. Robert Perliński Kursory Wyjątki Wyjątki predefiniowane Wyjątki niezdefiniowane wcześniej Definiowanie własnych wyjątków Kursory niejawne - tworzone automatycznie dla wszystkich zapytań SQL manipulujących na danych oraz dla zapytań SELECT wewnątrz PL/SQL. Kursory jawne - tworzone i zarządzanie przez programistę dla zapytań, które zwracają więcej niż jeden wiersz. Podsumowanie Źródła Systemy baz danych - wykład IV 4/34 Kursor jawny Systemy baz danych wykład IV dr inż. Robert Perliński Kursory Wyjątki Wyjątki predefiniowane Wyjątki niezdefiniowane wcześniej Definiowanie własnych wyjątków Podsumowanie Obsługa kursora jawnego (instrukcje sterujące): deklaracja, otwarcie (OPEN), pobranie danych (FETCH), zamknięcie (CLOSE). Źródła Systemy baz danych - wykład IV 5/34 Deklaracja kursora Systemy baz danych wykład IV dr inż. Robert Perliński Kursory Wyjątki Deklaracja kursora: CURSOR nazwa [(parametr1 typ [:=|DEFAULT wartosc1] [, parametr2...]...)] [RETURN typ] IS SELECT...; Przykłady: Wyjątki predefiniowane Wyjątki niezdefiniowane wcześniej CURSOR c_szefowie IS SELECT DISTINCT kierownik FROM pracownicy; Definiowanie własnych wyjątków Podsumowanie Źródła CURSOR c_dzial (p_id NUMBER) IS SELECT * FROM pracownicy WHERE id_dzialu=p_id; CURSOR c_dzial (p_id NUMBER := 10) IS SELECT * FROM pracownicy WHERE id_dzialu=p_id; CURSOR c_pracownicy RETURN pracownicy%ROWTYPE; Systemy baz danych - wykład IV 6/34 Otwarcie kursora Systemy baz danych wykład IV dr inż. Robert Perliński Kursory Wyjątki Wyjątki predefiniowane Wyjątki niezdefiniowane wcześniej Definiowanie własnych wyjątków Podsumowanie Źródła OPEN nazwa (lista_parametrow); Np.: DECLARE CURSOR c_dzial (p_id NUMBER := 10) IS SELECT * FROM pracownicy WHERE id_dzialu=p_id; ... BEGIN OPEN c_dzial(20); ... END; Systemy baz danych - wykład IV 7/34 Pobranie danych Systemy baz danych wykład IV dr inż. Robert Perliński FETCH nazwa INTO {lista_zmiennych|zmienna_rekordowa}; Np.: Kursory Wyjątki Wyjątki predefiniowane Wyjątki niezdefiniowane wcześniej Definiowanie własnych wyjątków Podsumowanie Źródła DECLARE CURSOR c_dzial (p_id NUMBER := 10) IS SELECT * FROM pracownicy WHERE id_dzialu=p_id; vr_pracownik pracownicy%ROWTYPE; ... BEGIN OPEN c_dzial(20); FETCH c_dzial INTO v_pracownik; ... END; Systemy baz danych - wykład IV 8/34 Zamknięcie kursora Systemy baz danych wykład IV dr inż. Robert Perliński Kursory Wyjątki Wyjątki predefiniowane Wyjątki niezdefiniowane wcześniej Definiowanie własnych wyjątków Podsumowanie Źródła CLOSE nazwa; Np.: DECLARE CURSOR c_dzial (p_id NUMBER := 10) IS SELECT * FROM pracownicy WHERE id_dzialu=p_id; vr_pracownik pracownicy%ROWTYPE; ... BEGIN OPEN c_dzial(20); FETCH c_dzial INTO v_pracownik; CLOSE c_dzial; ... END; Systemy baz danych - wykład IV 9/34 Atrybuty kursora jawnego Systemy baz danych wykład IV dr inż. Robert Perliński Każdy kursor posiada atrybuty: %ISOPEN - zwraca TRUE jeżeli kursor jest otwarty, w przeciwnym razie zwraca FALSE (dla niejawnego zawsze FALSE), Kursory Wyjątki Wyjątki predefiniowane Wyjątki niezdefiniowane wcześniej Definiowanie własnych wyjątków Podsumowanie Źródła %FOUND - po otwarciu kursora ale przed pierwszym pobraniem danych zwraca NULL; zwraca TRUE jeżeli ostatnie pobranie (FETCH) zwróciło dane albo FALSE jeśli nie zwróciło danych, %NOTFOUND - po otwarciu kursora ale przed pierwszym pobraniem danych zwraca NULL; zwraca TRUE jeżeli ostatnie pobranie nie zwróciło danych albo TRUE jeśli zwróciło dane, %ROWCOUNT - zwraca liczbę pobranych wierszy od momentu otwarcia kursora; przed pierwszym pobraniem zwraca 0. Systemy baz danych - wykład IV 10/34 Pętle obsługujące kursor Systemy baz danych wykład IV dr inż. Robert Perliński Kursory Wyjątki Wyjątki predefiniowane Wyjątki niezdefiniowane wcześniej Definiowanie własnych wyjątków Podsumowanie Źródła DECLARE CURSOR c_dzial (p_id NUMBER := 10) IS SELECT * FROM pracownicy WHERE id_dzialu=p_id; vr_pracownik pracownicy%ROWTYPE; BEGIN OPEN c_dzial(20); LOOP FETCH c_dzial INTO vr_pracownik; EXIT WHEN c_dzial%NOTFOUND OR c_dzial%NOTFOUND IS NULL; dbms_output.put_line(c_dzial%ROWCOUNT || ' . ' || vr_pracownik.nazwisko); END LOOP; dbms_output.put_line('Wybrano '|| c_dzial%ROWCOUNT||' wierszy.'); CLOSE c_dzial; END; Systemy baz danych - wykład IV 11/34 Pętla FOR obsługująca kursor I Systemy baz danych wykład IV dr inż. Robert Perliński Kursory Wyjątki Wyjątki predefiniowane Wyjątki niezdefiniowane wcześniej Definiowanie własnych wyjątków Podsumowanie Źródła DECLARE CURSOR c_dzial (p_id NUMBER := 10) IS SELECT * FROM pracownicy WHERE id_dzialu=p_id; BEGIN FOR vr_pracownik IN c_dzial(20) LOOP dbms_output.put_line(vr_pracownik.nazwisko); END LOOP; END; Systemy baz danych - wykład IV 12/34 Pętla FOR obsługująca kursor II Systemy baz danych wykład IV dr inż. Robert Perliński Kursory Wyjątki Wyjątki predefiniowane Wyjątki niezdefiniowane wcześniej Definiowanie własnych wyjątków Podsumowanie Źródła DECLARE v_id pracownicy.id_dzialu%TYPE := &id; BEGIN FOR vr_pracownik IN (SELECT * FROM pracownicy WHERE id_dzialu = v_id ) LOOP dbms_output.put_line(vr_pracownik.nazwisko); END LOOP; END; Systemy baz danych - wykład IV 13/34 Wyjątki Systemy baz danych wykład IV dr inż. Robert Perliński Kursory Wyjątki Wyjątki predefiniowane Czym jest wyjątek? Wyjątki niezdefiniowane wcześniej Definiowanie własnych wyjątków Podsumowanie Źródła Systemy baz danych - wykład IV 14/34 Wyjątek Systemy baz danych wykład IV dr inż. Robert Perliński Kursory Wyjątki Wyjątki predefiniowane Wyjątki niezdefiniowane wcześniej Definiowanie własnych wyjątków Podsumowanie Źródła Wyjątek błąd który może wystąpić w czasie wykonywania bloku PL/SQL. Zdarzenie to powoduje przerwanie normalnego toku działania programu. Wyjątek można obsłużyć wychwytując go (obsługa sytuacji wyjątkowej) albo przekazując go (propagacja) do środowiska uruchomienia programu. Wyjątek może być wywołany niejawnie przez serwer Oracle albo jawnie przez program. Systemy baz danych - wykład IV 15/34 Rodzaje wyjątków Systemy baz danych wykład IV dr inż. Robert Perliński Kursory Wyjątki Wywoływane niejawnie zdefiniowane wcześniej nie zdefiniowane wcześniej Wyjątki predefiniowane Wyjątki niezdefiniowane wcześniej Definiowanie własnych wyjątków Wywoływane jawnie - predefiniowane przez użytkownika Podsumowanie Źródła Systemy baz danych - wykład IV 16/34 Wyjątki predefiniowane I Systemy baz danych wykład IV dr inż. Robert Perliński Kursory Wyjątki Wyjątki predefiniowane Wyjątki niezdefiniowane wcześniej Definiowanie własnych wyjątków Podsumowanie Źródła Niektóre wyjątki zgłaszane automatycznie przez system: CASE_NOT_FOUND - żadna z podanych klazul WHEN nie spełnia warunku, a nie przewidziano sekcji domyślnej ELSE. CURSOR_ALREADY_OPEN - próba otwarcia otwartego kursora; kursor musi być zamknięty przed próbą ponownego otwarcia go. DUP_VAL_ON_INDEX - próba naruszenia ograniczenia unikalnej wartości. INVALID_CURSOR - nielegalna operacja na kursorze, np. próba zamknięcia nieotwartego kursora. INVALID_NUMBER - w wyrażeniach SQL błąd konwersji znaków na liczbę wartości (ciąg zanków nie przedstawia prawidłowej liczby). W kodzie PL/SQL wywoływany jest błąd VALUE_ERROR. Systemy baz danych - wykład IV 17/34 Wyjątki predefiniowane II Systemy baz danych wykład IV dr inż. Robert Perliński Kursory Wyjątki Wyjątki predefiniowane Wyjątki niezdefiniowane wcześniej Definiowanie własnych wyjątków Podsumowanie Źródła LOGIN_DENIED - nieudana próba połączenia do bazy, błędny login albo hasło. NO_DATA_FOUND - instrukcja SELECT INTO nie zwróciła żadnego wiersza albo program odnosi się do usuniętego elementu w zagnieżdżonej tabeli albo do niezainicjowanego elementu w tabeli asocjacyjnej. NOT_LOGGED_ON - program próbuje operować na baze danych nie będąc z nią połączonym. TIMEOUT_ON_RESOURCE - przekroczenie czasu oczekiwania na zasoby przekazywane do bazy danych. TOO_MANY_ROWS - instrukcja SELECT INTO zwróciła więcej niż jeden wiersz. Systemy baz danych - wykład IV 18/34 Wyjątki predefiniowane III Systemy baz danych wykład IV dr inż. Robert Perliński Kursory Wyjątki Wyjątki predefiniowane Wyjątki niezdefiniowane wcześniej Definiowanie własnych wyjątków VALUE_ERROR - wystąpił błąd arytmetyczny, konwersji, przycięcia wartości albo przekroczenia ograniczenia jej rozmiaru. ZERO_DIVIDE - próba dzielenia przez zero. Podsumowanie Źródła Systemy baz danych - wykład IV 19/34 Funkcje umożliwiające identyfikację błędu Systemy baz danych wykład IV dr inż. Robert Perliński Identyfikacja błędu (obie funkcje bez parametrów): Kursory Wyjątki Wyjątki predefiniowane Wyjątki niezdefiniowane wcześniej Definiowanie własnych wyjątków Podsumowanie SQLERRM - funkcja zwraca opis błędu związanego z wyjątkiem, który wystąpił jako ostatni. SQLCODE - funkcja zwracająca numer wyjątku, który wystąpił jako ostatni. Dla wyjątków wewnętrznych zwraca numer błędu z bazy Oracle. Źródła Systemy baz danych - wykład IV 20/34 Wychwytywanie wyjątków Systemy baz danych wykład IV dr inż. Robert Perliński Kursory Wyjątki Wyjątki predefiniowane Wyjątki niezdefiniowane wcześniej Definiowanie własnych wyjątków Podsumowanie Źródła EXCEPTION WHEN wyjatek1 [OR wyjatek2 ...] THEN instrukcje1; [WHEN wyjatek3 [OR wyjatek4 ...] THEN instrukcje2; ...] [WHEN OTHERS THEN instrukcje_n;] Systemy baz danych - wykład IV 21/34 Sekcja WHEN OTHERS Systemy baz danych wykład IV dr inż. Robert Perliński Kursory Wyjątki Wyjątki predefiniowane Wyjątki niezdefiniowane wcześniej Definiowanie własnych wyjątków Sekcja OTHERS jest używana do obsługi wszystkich wyjątków, które nie zostały wcześniej określone. Sekcja OTHERS musi być ostatnia na liście obsługi wyjątków. Podsumowanie Źródła Systemy baz danych - wykład IV 22/34 Wyjątki niezdefiniowane wcześniej Systemy baz danych wykład IV dr inż. Robert Perliński Kursory Wyjątki Wyjątki predefiniowane Wyjątki niezdefiniowane wcześniej Definiowanie własnych wyjątków Podsumowanie Są dowolnymi innymi standardowymi błędami serwera Oracle Muszą być zadeklarowane w sekcji deklaracji Należy powiązać podaną nazwę z zewnętrznym numerem błędu używając: PRAGMA EXCEPTION_INIT Źródła Systemy baz danych - wykład IV 23/34 Wyjątki niezdefiniowane wcześniej Systemy baz danych wykład IV dr inż. Robert Perliński Kursory Wyjątki Wyjątki predefiniowane Wyjątki niezdefiniowane wcześniej Definiowanie własnych wyjątków Podsumowanie Źródła DECLARE e_insert EXCEPTION; PRAGMA EXCEPTION_INIT(e_insert, -014000); BEGIN INSERT INTO dzial (id_dzialu, nazwa) VALUES(300, 'Executives') EXCEPTION WHEN e_insert THEN DBMS_OUTPUT.PUT_LINE ('Błąd wstawiania'); END; / Systemy baz danych - wykład IV 24/34 Wyjątki użytkownika Systemy baz danych wykład IV dr inż. Robert Perliński Kursory Wyjątki Wyjątki predefiniowane Jak tworzyć i obsługiwać własne wyjątki? Wyjątki niezdefiniowane wcześniej Definiowanie własnych wyjątków Podsumowanie Źródła Systemy baz danych - wykład IV 25/34 Korzystanie z wyjątków użytkownika I Systemy baz danych wykład IV dr inż. Robert Perliński Kursory deklaracja nazwa_wyjatku EXCEPTION; podniesienie wyjątku RAISE nazwa_wyjatku; Wyjątki Wyjątki predefiniowane Wyjątki niezdefiniowane wcześniej Definiowanie własnych wyjątków Podsumowanie Źródła przechwycenie w sekcji obsługi wyjątków. EXCEPTION WHEN wyjatek1 THEN instrukcje1; WHEN wyjatek2 THEN instrukcje2; ... WHEN OTHERS THEN instrukcje_n; Systemy baz danych - wykład IV 26/34 Korzystanie z wyjątków użytkownika II Systemy baz danych wykład IV dr inż. Robert Perliński Kursory Wyjątki Wyjątki predefiniowane Wyjątki niezdefiniowane wcześniej Definiowanie własnych wyjątków Podsumowanie Źródła DECLARE e_zla_wartosc EXCEPTION; ... BEGIN ... IF v_id = 0 THEN RAISE e_zla_wartosc; END IF; ... EXCEPTION WHEN e_zla_wartosc THEN dbms_output.put_line('Bledna wartosc identyfikatora.'); END; Systemy baz danych - wykład IV 27/34 Propagacja wyjątków I Systemy baz danych wykład IV dr inż. Robert Perliński Kursory Wyjątki Wyjątki predefiniowane Wyjątki niezdefiniowane wcześniej Definiowanie własnych wyjątków Podsumowanie Źródła BEGIN ... BEGIN ... IF v_id = 0 THEN RAISE e_zla_wartosc; END IF; ... EXCEPTION WHEN e_zla_wartosc THEN dbms_output.put_line('Bledna wartosc identyfikatora.'); END; ... EXCEPTION ... END; Systemy baz danych - wykład IV 28/34 Propagacja wyjątków II Systemy baz danych wykład IV dr inż. Robert Perliński Kursory Wyjątki Wyjątki predefiniowane Wyjątki niezdefiniowane wcześniej Definiowanie własnych wyjątków Podsumowanie Źródła BEGIN ... BEGIN ... IF v_id = 0 THEN RAISE e_zla_wartosc; END IF; ... EXCEPTION WHEN TOO_MANY_ROWS THEN dbms_output.put_line('Za duzo wartosci.'); END; ... EXCEPTION WHEN e_zla_wartosc THEN dbms_output.put_line('Bledna wartosc ident...'); END; Systemy baz danych - wykład IV 29/34 Propagacja wyjątków III Systemy baz danych wykład IV dr inż. Robert Perliński Kursory Wyjątki Wyjątki predefiniowane Wyjątki niezdefiniowane wcześniej Definiowanie własnych wyjątków Podsumowanie Źródła BEGIN ... BEGIN ... IF v_id = 0 THEN RAISE e_zla_wartosc; END IF; ... EXCEPTION WHEN TOO_MANY_ROWS THEN dbms_output.put_line('Za duzo wartosci.'); END; ... EXCEPTION WHEN VALUE_ERROR THEN dbms_output.put_line('Blad konwersji.'); END; Systemy baz danych - wykład IV 30/34 Raise application error Systemy baz danych wykład IV dr inż. Robert Perliński Kursory Wywołania procedury Raise_application_error pozwala przerwać działanie programu i wyprowadzić na ekran informacje o błędzie. Pozwala to pominąć zwracanie niewychwyconego wyjątku. Składnia: Wyjątki Wyjątki predefiniowane Wyjątki niezdefiniowane wcześniej Definiowanie własnych wyjątków Podsumowanie Źródła Raise_application_error( numer_bledu, opis[, {TRUE|FALSE}]); Numer błedu zawiera się w przedziale od -20000 do -20999, a opis może zajmować 2048 bajtów. Opcjonalny trzeci parametr dla wartości FALSE (domyślnie) powoduje, że zgłaszany błąd zastępuje wszystkie wcześniejsze błędy na stosie. Wartość TRUE oznacza dodanie błędu do stosu wcześniejszych błędów. Systemy baz danych - wykład IV 31/34 Raise application error Systemy baz danych wykład IV dr inż. Robert Perliński Kursory Wyjątki Wyjątki predefiniowane Wyjątki niezdefiniowane wcześniej Definiowanie własnych wyjątków Podsumowanie Źródła Przykład użycia: IF v_id = 0 THEN Raise_application_error(-20002, 'Błędny identyfikator'); ELSE ... END IF; Systemy baz danych - wykład IV 32/34 Podsumowanie Systemy baz danych wykład IV dr inż. Robert Perliński PL/SQL pozwala na: Kursory korzystanie ze zmiennych, stałych, Wyjątki korzystanie z instrukcji sterujących, Wyjątki predefiniowane Wyjątki niezdefiniowane wcześniej Definiowanie własnych wyjątków Podsumowanie Źródła przetwarzanie sekwencyjne zorientowane na dane, obsługiwanie wyjątków, użycie wcześniej zdefiniowanych pakietów i bibliotek, i wiele innych o czym na następnym wykładzie... Systemy baz danych - wykład IV 33/34 Źródła Systemy baz danych wykład IV dr inż. Robert Perliński Kursory Wyjątki Wyjątki predefiniowane Wyjątki niezdefiniowane wcześniej Definiowanie własnych wyjątków http://docs.oracle.com/cd/B28359_01/appdev. 111/b28370/toc.htm M. Lentner, Oracle 9i Kompletny podrêcznik u¿ytkownika, PJWSTK - W-wa, 2003 http://www.ploug.org.pl/showhtml.php?file= szkola/szkola_9/materialy Podsumowanie http://plsql-tutorial.com/index.htm Źródła http://www.toadworld.com/platforms/oracle/w/ wiki/8243.plsql-obsession.aspx Systemy baz danych - wykład IV 34/34