PL/SQL Zajęcia nr II PL/SQL(2) M. Rakowski - WSISiZ
Obsługa wyjątków Wyjątkiem w PL/SQL jest spełnienie warunków wystąpienia sytuacji nieprawidłowej, w której ciąg instrukcji nie jest dalej realizowany, ale realizacja przechodzi do odpowiedniego miejsca bloku PL/SQL w klauzuli EXCEPTION lub sytuacja zgłaszana jest jako błąd środowisku wywołującemu. Wyjątki dzielą się na predefiniowane i definiowane przez użytkownika. Przykładami wyjątków predefiniowanych mogą być: "NO_DATA_FOUND" lub "TOO_MANY_ROWS". W języku PL/SQL użytkownik może definiować wyjątki w części deklaracyjnej bloku PL/SQL oraz wiązać błędy PL/SQL ze zdefiniowanymi wyjątkami. PL/SQL(2) M. Rakowski - WSISiZ
Wyjątki predefiniowane CURSOR_ALREADY_OPEN - wywoływany w przypadku próby otwarcia kursora już otwartego; INVALID_CURSOR - wywoływany w przypadku próby dostępu do nieprawidłowego kursora (np. nie otwartego); INVALID_NUMBER - wywoływany w przypadku próby wykonania konwersji do typu numerycznego z tekstu, który nie reprezentuje liczby; NO_DATA_FOUND - wywoływany wtedy, gdy rozkaz SELECT powinien zwrócić jeden wiersz a nie zwraca żadnego (np. SELECT ... INTO) oraz wskazaniu nieokreślonej komórki tablicy PL/SQL ; STORAGE_ERROR - wywoływany w przypadku braku wolnej pamięci lub uszkodzenia zawartości pamięci; TOO_MANY_ROWS - wywoływany w przypadku, gdy rozkaz SELECT zwraca więcej niż jeden wiersz, a oczekiwany jest tylko jeden (np. SELECT ... INTO); VALUE_ERROR - wywoływany w przypadku przypisania złej wartości do zmiennej lub pola; ZERO_DIVIDE - próba dzielenia przez zero; Wyjątki (jako obsługa poszczególnych błędów) są definiowane w pakiecie STANDARD Klauzula OTHERS nie jest specyfikowanym wyjątkiem, ale sekcją obsługi dowolnego wyjątku PL/SQL(2) M. Rakowski - WSISiZ
Przykład obsługi wyjątku DECLARE x NUMBER := 1; y NUMBER := 1; BEGIN DBMS_OUTPUT.PUT_LINE( x/y ); DBMS_OUTPUT.PUT_LINE(‘ Dalsze wykonanie’); EXCEPTION WHEN ZERO_DIVIDE THEN DBMS_OUTPUT.PUT_LINE(‘ y wyniosło zero!!!’); END; Zadanie: Wykonać kod jak powyżej, następnie zmienić y na 0 i wykonać, a następnie objąć komentarzem całą sekcję obsługi wyjątku ( /* .. */ lub każdą linię --) i wykonać PL/SQL(2) M. Rakowski - WSISiZ
Definiowanie własnych wyjątków Definiowanie w sekcji deklaracyjnej bloku PL/SQL własnego wyjątku DECLARE ex_koniec EXCEPTION; BEGIN Wiązanie błędu ze zdefiniowanym wyjątkiem ex_zly_miesiac EXCEPTION ; PRAGMA EXCEPTION_INIT(ex_zly_miesiac, -1843 ); DBMS_OUTPUT.PUT_LINE( to_date( '13-13-2005', 'dd-mm-yyyy') ); EXCEPTION WHEN ex_zly_miesiac THEN DBMS_OUTPUT.PUT_LINE( 'to zły miesiąc był..' ); END; Zadanie: analogicznie zbudować obsługę złej specyfikacji dnia PL/SQL(2) M. Rakowski - WSISiZ
Wykorzystanie wyjątków Standaryzacja struktur oprogramowania (jedno miejsce obsługi wyjątku dla bloku, specyficzne wykorzystanie jako instrukcji sterującej - warunkowej) Komunikacja błędów w modelu klient serwer (przekazywanie komunikatu błędu oprogramowaniu wywołującemu operację) Raise_Application_Error( numer_bledu , tekst_opisu_bledu ) ; Gdzie: numer_bledu – <-20000, -20999> (dla uniknięcia konfliktu) tekst_opisu_bledu – ciąg znaków do 2048 znaków PL/SQL(2) M. Rakowski - WSISiZ
Schemat zastosowania wyjątku w aplikacji klienckiej Operacja na serwerze BEGIN … IF b_nie_znaleziono_stawek THEN RAISE_APPLICATION_ERROR(-20101 , ‘Brak aktualnych stawek'); END IF; END; Kod oprogramowania klienckiego DECLARE ex_brak_stawek EXCEPTION; PRAGMA EXCEPTION_INIT(ex_brak_stawek, -20101); BEGIN … Operacja(…); EXCEPTION WHEN ex_brak_stawek THEN Zapisz_Blad (SQLERRM); END; PL/SQL(2) M. Rakowski - WSISiZ
Instrukcje warunkowe; IF Składnia: IF warunek THEN ciąg instrukcji [ ELSIF warunek THEN ] * ELSE ] END IF; Gdzie: warunek może się składać z ciągu warunków lub wartości logicznych (również uzyskiwanych funkcjami) połączonych spójnikami *- oznacza możliwą wielokrotność ciąg instrukcji oznacza jedną lub więcej instrukcję PL/SQL PL/SQL(2) M. Rakowski - WSISiZ
Instrukcje warunkowe: CASE Składnia: Wersja 1: CASE element_sprawdzany [ WHEN wartość THEN ciąg instrukcji ]1* [ ELSE ciąg instrukcji ]! END CASE; Wersja 2: CASE [ WHEN warunek THEN ciąg instrukcji ]1* Gdzie: 1* oznacza minimum jedno wystąpienie ! oznacza, że mimo, że sekcja nie musi wystąpić, nie znalezienie obsługiwanego przypadku powoduje błąd, gdy sekcja nie występuje warunek – wyrażenie posiadające wartość logiczną PL/SQL(2) M. Rakowski - WSISiZ
Instrukcje warunkowe: CASE cd Instrukcja CASE funkcjonuje również jako operator umożliwiający określenie wartości (analogia do SQL 9i): Składnia: Zmienna := CASE element_sprawdzany [ WHEN wartość THEN wartość ]1* [ ELSE wartość ] END; Gdzie: 1* oznacza minimum jedno wystąpienie PL/SQL(2) M. Rakowski - WSISiZ
Instrukcje pętli: LOOP Składnia: LOOP ciąg instrukcji PL/SQL END LOOP; Polecenie EXIT bez parametru służy do bezwarunkowego lub warunkowego wyjścia z pętli. EXIT [WHEN warunek] ; Parametry: warunek – wyrażenie posiadające wartość logiczną. Wyjście następuje tylko wtedy, gdy wynikiem obliczenia warunku jest wartość TRUE. PL/SQL(2) M. Rakowski - WSISiZ
Instrukcje pętli: FOR Składnia: FOR zmienna_indeksowa IN [REVERSE] zakres LOOP ciąg instrukcji PL/SQL END LOOP; Pętla FOR udostępnia możliwość wykonywania przy pomocy zmiennej indeksowej, która iterowana jest w zdefiniowanym zakresie. Deklaracja zmiennej indeksowej nie jest obowiązkowa, ale zakres istnienia zmiennej indeksowej dotyczy tylko danej pętli. Zakres może być zdefiniowany jako numeryczny ( wartosc_od..wartosc_do ) lub kursorowy. Istnieje klauzula REVERSE umożliwiająca zmniejszanie zmiennej indeksowej pętli (domyślnie indeks jest zwiększany). PL/SQL(2) M. Rakowski - WSISiZ
Instrukcje pętli: WHILE Składnia: WHILE warunek LOOP ciąg instrukcji END LOOP; Pętla jest iterowana dotąd, dopóki jest spełniony warunek (posiada wartość logiczną TRUE). PL/SQL(2) M. Rakowski - WSISiZ
Zadania Za pomocą anonimowego bloku z inicjowaną zmienną x umożliwić wypisanie wartości funkcji na podstawie wykresu Napisany w p.1 blok zmodyfikować aby wypisać zakres zachowania się funkcji w zakresie -5..5 (dla liczb całkowitych) Napisany w p. 1 blok zmodyfikować tak, żeby od zadanej, inicjacją zmiennej, wielkości podać największą wartość argumentu całkowitego funkcji przy której wartość funkcji jest ujemna. PL/SQL(2) M. Rakowski - WSISiZ