• Nie Znaleziono Wyników

Zajęcia nr II PL/SQL

N/A
N/A
Protected

Academic year: 2021

Share "Zajęcia nr II PL/SQL"

Copied!
14
0
0

Pełen tekst

(1)

PL/SQL

Zajęcia nr II

(2)

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.

(3)

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

(4)

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ć

(5)

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

DECLARE

ex_zly_miesiac EXCEPTION ;

PRAGMA EXCEPTION_INIT(ex_zly_miesiac, -1843 );

BEGIN

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

(6)

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

(7)

Schemat zastosowania wyjątku w aplikacji klienckiej

BEGIN

IF b_nie_znaleziono_stawek THEN

RAISE_APPLICATION_ERROR(-20101 , ‘Brak aktualnych stawek');

END IF;

… END;

DECLARE

ex_brak_stawek EXCEPTION;

PRAGMA EXCEPTION_INIT(ex_brak_stawek, -20101);

BEGIN

Operacja(…);

EXCEPTION

Operacja na serwerze

Kod oprogramowania klienckiego

(8)

Instrukcje warunkowe; IF

Składnia:

IF warunek THEN ciąg instrukcji

[

ELSIF warunek THEN ciąg instrukcji ] *

[ ELSE

ciąg instrukcji ]

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

(9)

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

* [ ELSE ciąg instrukcji ]!

END CASE;

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

(10)

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

(11)

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.

Składnia:

EXIT [WHEN warunek] ;

Parametry:

(12)

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).

(13)

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).

(14)

Zadania

1. Za pomocą anonimowego bloku z inicjowaną zmienną x umożliwić wypisanie wartości funkcji na podstawie wykresu 2. Napisany w p.1 blok

zmodyfikować aby wypisać zakres zachowania się

funkcji w zakresie -5..5 (dla liczb całkowitych)

3. 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.

Cytaty

Powiązane dokumenty

Każdy typ danych definiuje zbiór poprawnych wartości i zbiór operatorów, które mogą być zastosowany do zmiennej danego typu. Podtyp definiuje ten sam zbiór operatorów co jego typ

Ten rodzaj zapytań działając analogicznie do zapytania wybierającego generuje nową tabelę zawierającą dane spełniające kryteria zapytania

• Funkcja PL/SQL jest nazwaną jednostką programu, która realizuje akcję opisaną instrukcjami i zwraca wynik typu. określonego w

• Klauzula INSTEAD OF – jest związana z implementacją wyzwalacza na widoku, który może być oparty o złączenia tabel i wówczas zamiast próby operacji na widoku (co się

Tworzenie nowych grup łamania jest możliwe w kreatorze raportu (przy wybraniu odpowiedniego rozkładu) lub w modelu danych poprzez „wyciągnięcie” kolumny na zewnątrz grupy w

Jeśli ciąg znaków 2 nie jest podany to przyjmowana jest spacja.. Jeśli n jest mniejsze od długości string1, to zwracane jest n pierwszych znaków z

1.Dana jest tabela Osoby(Imie, Nazwisko, Zarobki). Które z następujących instrukcji są składniowo poprawnymi instrukcjami SQL w Oracle:. c)DELETE FROM Osoby

Wybrać nazwiska, numery pracowników, stanowiska pracy, płacę i numery departamentów wszystkich zatrudnionych na stanowisku CLERK.. Klauzula WHERE (opcjonalna) ograniczająca