Professional Documents
Culture Documents
Spis treści
1 Kursory 1
2 Wyjątki 4
2.1 Wyjątki predefiniowane . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.2 Wyjątki niezdefiniowane wcześniej . . . . . . . . . . . . . . . . . . . . . . . 5
2.3 Definiowanie własnych wyjątków . . . . . . . . . . . . . . . . . . . . . . . . 6
3 Podsumowanie 8
4 Źródła 8
1 Kursory
Kursor
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).
Rodzaje kursorów
Kursory jawne - tworzone i zarządzanie przez programistę dla zapytań, które zwra-
cają więcej niż jeden wiersz.
Kursor jawny
Obsługa kursora jawnego (instrukcje sterujące):
deklaracja,
otwarcie (OPEN),
zamknięcie (CLOSE).
Deklaracja kursora
Deklaracja kursora:
1
CURSOR c_szefowie IS
SELECT DISTINCT kierownik FROM pracownicy;
Otwarcie kursora
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;
Pobranie danych
FETCH nazwa INTO {lista_zmiennych|zmienna_rekordowa};
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;
...
END;
Zamknięcie kursora
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;
2
Atrybuty kursora jawnego
Każdy kursor posiada atrybuty:
%ISOPEN - zwraca TRUE jeżeli kursor jest otwarty, w przeciwnym razie zwraca FALSE
(dla niejawnego zawsze FALSE),
%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 FALSE jeśli zwróciło dane,
%ROWCOUNT - zwraca liczbę pobranych wierszy od momentu otwarcia kursora; przed pierw-
szym pobraniem zwraca 0.
3
2 Wyjątki
Wyjątki
Wyjątek
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 urucho-
mienia programu. Wyjątek może być wywołany niejawnie przez serwer Oracle albo jawnie
przez program.
Rodzaje wyjątków
Wywoływane niejawnie
– zdefiniowane wcześniej
– nie zdefiniowane wcześniej
NO_DATA_FOUND - instrukcja SELECT INTO nie zwróciła żadnego wiersza albo pro-
gram odnosi się do usuniętego elementu w zagnieżdżonej tabeli albo do niezainicjo-
wanego elementu w tabeli asocjacyjnej.
NOT_LOGGED_ON - program próbuje operować na baze danych nie będąc z nią połą-
czonym.
4
VALUE_ERROR - wystąpił błąd arytmetyczny, konwersji, przycięcia wartości albo prze-
kroczenia ograniczenia jej rozmiaru.
SQLCODE - funkcja zwracająca numer wyjątku, który wystąpił jako ostatni. Dla wy-
jątków wewnętrznych zwraca numer błędu z bazy Oracle.
Wychwytywanie wyjątków
EXCEPTION
WHEN wyjatek1 [OR wyjatek2 ...] THEN
instrukcje1;
[WHEN wyjatek3 [OR wyjatek4 ...] THEN
instrukcje2;
...]
[WHEN OTHERS THEN
instrukcje_n;]
Sekcja OTHERS jest używana do obsługi wszystkich wyjątków, które nie zostały
wcześniej określone.
Należy powiązać podaną nazwę z zewnętrznym numerem błędu używając: PRAGMA EXCEPTION_INIT
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;
/
5
2.3 Definiowanie własnych wyjątków
Wyjątki użytkownika
deklaracja
nazwa_wyjatku EXCEPTION;
podniesienie wyjątku
RAISE nazwa_wyjatku;
EXCEPTION
WHEN wyjatek1 THEN
instrukcje1;
WHEN wyjatek2 THEN
instrukcje2;
...
WHEN OTHERS THEN
instrukcje_n;
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;
6
Propagacja wyjątków I
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;
Propagacja wyjątków II
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;
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;
...
7
EXCEPTION
WHEN VALUE_ERROR THEN
dbms_output.put_line('Blad konwersji.');
END;
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 baj-
tó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.
IF v_id = 0 THEN
Raise_application_error(-20002,
'Błędny identyfikator');
ELSE
...
END IF;
3 Podsumowanie
Podsumowanie
PL/SQL pozwala na:
obsługiwanie wyjątków,
4 Źródła
Źródła
http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/toc.htm
http://www.ploug.org.pl/showhtml.php?file=szkola/szkola_9/materialy
8
http://plsql-tutorial.com/index.htm
http://www.toadworld.com/platforms/oracle/w/wiki/8243.plsql-obsession.
aspx