Wydział Informatyki Politechnika Białostocka Obsługa wyjątków Technologie baz danych WYKŁAD 7: Wyjątki [] [] Agnieszka Oniśko, Małgorzata Krętowska TBD-wyjątki 1 TBD-wyjątki 2 Sposoby powstania sytuacji wyjątkowej Obsługa wyjątków Wystąpienie błędu systemu ORACLE wyjątki predefiniowane wyjątki nie-predefiniowane Jawne wywołanie sytuacji wyjątkowej przez użytkownika przez instrukcję RAISE nazwa_wyjątku ; RAISE nazwa_wyjątku; WHEN wyjątek-1 THEN instrukcja-1; WHEN wyjątek-2 THEN instrukcja-2; WHEN OTHERS THEN instrukcja-3; TBD-wyjątki 3 TBD-wyjątki 4 Klauzula WHEN OTHERS Klauzula WHEN OTHERS powinna być umieszczana po wszystkich innych klauzulach obsługi wyjątków Klauzula WHEN OTHERS może wystąpić tylko jeden raz Wyjątki predefiniowane - przykład v_cena ksiazka.cena%type; v_isbn ksiazka.isbn%type; SELECT cena, isbn INTO v_cena, v_isbn FROM t_ksiazka WHERE cena>100; TBD-wyjątki 5 WHEN NO_DATA_FOUND THEN :str1 := no data ; -- obsłuż wyjątek WHEN TOO_MANY_ROWS THEN :str1 := too many ; -- obsłuż wyjątek TBD-wyjątki 6
Wyjątki predefiniowane Wyjątki predefiniowane: Przykład NO_DATA_FOUND TOO_MANY_ROWS ZERO_DIVIDE LOGIN_DENIED NOT_LOGGED_ON ACCESS_INTO_NULL COLLECTION_IS_NULL CURSOR_ALREADY_OPEN DUP_VAL_ON_INDEX INVALID_CURSOR INVALID_NUMBER TBD-wyjątki 7 pe_ratio NUMBER(3,1); SELECT price / earnings INTO pe_ratio FROM stocks WHERE symbol = 'XYZ'; INSERT INTO stats (symbol, ratio) VALUES ('XYZ', pe_ratio); COMMIT; WHEN ZERO_DIVIDE THEN INSERT INTO stats (symbol, ratio) VALUES ('XYZ', NULL); COMMIT; WHEN OTHERS THEN ROLLBACK; TBD-wyjątki 8 Wyjątki predefiniowane Wyłapywanie nie-predefiniowanych wyjątków serwera ORACLE PL/SQL User s Guide and Reference Rozdział: Error handling Deklaracja Powiązanie Odwołanie Sekcja deklaracyjna Sekcja obsługi wyjątków PRAGMA _INIT(wyjątek, numer_bledu); Łączymy nazwę wyjątku z już istniejącym numerem błędu TBD-wyjątki 9 TBD-wyjątki 10 Wyjątki nie-predefiniowane Funkcje do wyłapywania wyjątków cena_null ; PRAGMA _INIT(cena_null, -20101); WHEN cena_null THEN INSERT INTO KOMUNIKAT VALUES ( Cena ma wartość nieokreśloną ); SQLCODE (zwraca wartość liczbową błędu) SQLERRM (zwraca łańcuch zawierajacy komunikat powiązany z numerem błędu) TBD-wyjątki 11 TBD-wyjątki 12
Funkcje do wyłapywania wyjątków Wyłapywanie wyjątków definiowanych przez użytkownika v_kod_bledu NUMBER v_opis_bledu VARCHAR2(255); WHEN OTHERS THEN v_kod_bledu := SQLCODE; v_opis_bledu := SQLERRM; v_output := TO_CHAR(v_kod_błędu) : v_opis_błędu; Deklaracja Sekcja deklaracyjna Wywołanie Sekcja wykonywalna Odwołanie Sekcja obsługi wyjątków TBD-wyjątki 13 TBD-wyjątki 14 Wyjątki przykład PROCEDURE mod_cene (p_isbn t_ksiazka.isbn%type, p_wartosc NUMBER) IS v_cena t_ksiazka.isbn%type; cena_null ; SELECT cena INTO v_cena FROM t_ksiazka WHERE isbn = p_isbn; IF v_cena IS NULL THEN RAISE cena_null; UPDATE t_ksiazka SET cena = cena + p_wartosc WHERE isbn = p_isbn;.. END mod_cene; TBD-wyjątki 15 Wyjątki - przykład cd. PROCEDURE mod_cene (p_isbn t_ksiazka.isbn%type, p_wartosc NUMBER) IS v_cena t_ksiazka.isbn%type;... WHEN NO_DATA_FOUND THEN INSERT INTO komunikat VALUES ( Brak danych ); WHEN cena_null THEN INSERT INTO komunikat VALUES ( Cena początkowa ma wartość nieokreśloną ); END mod_cene; TBD-wyjątki 16 Definiowanie komunikatów Przykład RAISE_APPLICATION_ERROR (numer_błędu, komunikat) numer_błędu: -20000.. -20999 (wybiera użytkownik) komunikat: 512 znaków num_tables NUMBER; SELECT COUNT(*) INTO num_tables FROM USER_TABLES; IF num_tables < 1000 THEN /* Łączymy własny kod błędu (ORA-20101) z własnym komunikatem*/ raise_application_error(-20101, 'Expecting at least 1000 tables');.. / TBD-wyjątki 17 TBD-wyjątki 18
Wyjątki SELECT -- sprawdzenie błędu SELECT -- sprawdzenie błędu SELECT -- sprawdzenie błędu SELECT SELECT SELECT WHEN NO_DATA_FOUND THEN -- obsłuż wyjątek TBD-wyjątki 19 IF x=1 THEN RAISE A; IF x=2 THEN RAISE B; RAISE C; WHEN A THEN WHEN B THEN TBD-wyjątki 20 IF x=1 THEN RAISE A; IF x=2 THEN RAISE B; RAISE C; WHEN A THEN IF x=1 THEN RAISE A; IF x=2 THEN RAISE B; RAISE C; WHEN A THEN WHEN B THEN TBD-wyjątki 21 WHEN B THEN TBD-wyjątki 22 NULL w wyrażeniach i porównaniach ---------- początek bloku zagnieżdżonego past_due ; IF THEN RAISE past_due; ------------- koniec bloku zagnieżdżonego WHEN OTHERS THEN /*nazwa wyjątu past_due nie jest znana*/ ROLLBACK; Dowolne wyrażenie zawierające wartości NULL przybiera wartości NULL (wyjątek stanowi konkatenacja: wartość NULL traktowana jest jako pusty napis) Dowolne porównanie zawierające wartości NULL przybiera wartość NULL Operator IS NULL TBD-wyjątki 23 TBD-wyjątki 24
Sekwencje Sekwencje Obiekty bazy danych używane do generowania unikatowych wartości (zwykle na potrzeby kluczy głównych) Dostęp do kolejnych wartości umożliwiają pseudokolumny NEXTVAL (zwraca wartość zwiększoną w kolejnym kroku) CURRVAL (zwraca bieżącą wartość) CREATE SEQUENCE nazwa_sekwencji [ INCREMENT BY wartość START WITH wartość {MAXVALUE wartość NOMAXVALUE} {MINVALUE wartość NOMINVALUE } {CYCLE NOCYCLE } ] TBD-wyjątki 25 TBD-wyjątki 26 Sekwencje - przykład Sekwencje - przykład CREATE SEQUENCE sekw_2 INCREMENT BY 2 START WITH 100 MAXVALUE 120 CYCLE; FOR i IN 1..5 LOOP INSERT INTO komunikat(nr) END LOOP; VALUES(sekw_2.NEXTVAL); TBD-wyjątki 27 TBD-wyjątki 28 Sekwencje ALTER SEQUENCE nazwa_sekwencji [ INCREMENT BY wartość {MAXVALUE wartość NOMAXVALUE} {MINVALUE wartość NOMINVALUE } {CYCLE NOCYCLE } ] Sekwencje Mogą być używane: w klauzuli SET polecenia UPDATE W zewnętrznym zapytaniu w listach wartości polecenia INSERT Nie mogą być używane: w podzapytaniach w poleceniu SELECT z klauzulami ORDER BY, GROUP BY, CONNECT BY, HAVING z kwantyfikatorem DISTINCT TBD-wyjątki 29 TBD-wyjątki 30
Synonimy Synonimy Synonimy umożliwiają nadawanie alternatywnych nazw dla niektórych obiektów bazy danych Łatwiejsze wprowadzanie poleceń poprzez skrócenie nazwy obiektów znajdujących się w innych schematach tej samej bazy danych lub innych bazach Odizolowanie aplikacji i użytkowników od zmian zachodzących w konstrukcji bazy danych CREATE [PUBLIC] SYNONYM nazwa_synonimu FOR obiekt; Synonimy prywatne: tworzone dla określonej grupy użytkowników Synonimy publiczne: tworzone dla wszystkich użytkowników TBD-wyjątki 31 TBD-wyjątki 32 Synonimy - przykład CREATE PUBLIC SYNONYM s_ksiazka FOR t_ksiazka; RENAME stara_nazwa TO nowa_nazwa; TBD-wyjątki 33