Systemy baz danych

advertisement
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
Download