Obsługa błędów
Autor: Marcin Kasiński
21.01.2011 13:24:00 +0200
W bloku PL/SQL aby ułatwić obsługę wyjątkowych sytuacji istnieje podblok EXCEPTION definiujący zachowanie w przypadku wszelkiego rodzaju błędów zaistniałych w bloku PL/SQL.
Przykład:
DECLARE div_value NUMBER; BEGIN Select col1/col2 into div_value from tab where id=8; INSERT INTO stats(id,div) Values (8,div_value); COMMIT; EXCEPTION WHEN ZERO_DIVIDE THEN INSERT INTO stats(id,div) Values (8,NULL); COMMIT; WHEN OTHERS THEN ROLLBACK; END;
Ważną cechą wyjątków jest to, że nie ma potrzeby sprawdzać, czy nastąpił jakikolwiek błąd po każdym zapytaniu SQL. Możemy wykonać kilka zapytań SQL, a następnie w podbloku EXCEPTION określamy zachowanie w przypadku wystąpienia określonych zdarzeń podczas wykonywania wcześniejszych zapytań. W przypadku obsługi kilku błędów poprzez identyczny kod w podbloku EXCEPTION za słowem kluczowym WHEN nazwy wyjątków możemy łączyć operatorem logicznym OR, np:
WHEN exception1 OR exception2 OR exception3 THEN ...
Do obsługi błędów nieopisanych z nazwy w bloku EXCEPTION używamy znacznika OTHERS, jak to ma miejsce w przykładzie powyżej, co oznacza obsługę pozostałych wyjątków.
Deklarowanie własnych wyjątków
Aby zadeklarować i obsłużyć własny wyjątek należy w pierwszej kolejności w bloku DECLARE zadeklarować włąsny wyjątek poprzez jego nazwę:
nazwa_wyjątku EXCEPTION;
W bloku głównym aby wygenerować wyjątek należy użyć polecenia RAISE, gdzie jako parametr podajemy nazwe zadeklarowanego wyjątku. Następnie w bloku EXCEPTION należy zdefiniowany wyjątek obsłużyć poprzez :
WHEN nazwa_wyjątku THEN ...
Przykład:
DECLARE bad_number EXCEPTION; my_number NUMBER; BEGIN ... Select col1 into my_number from tab where col1=3; IF my_number<1 THEN RAISE bad_number' END IF; EXCEPTION WHEN bad_number THEN ROLLBACK; END;
SQLCODE i SQLERRM
Przy obsłudze błędów w bloku PL/SQL mamy do dyspozycji dwie wbudowane funkcje: SQLCODE i SQLERRM . Funkcja SQLCODE zwraca numer błędu związany z wykonanymi ostatnio operacjami SQL. Wartość 0 oznacza operacje zakończoną sukcesem. Funkcja SQLERRM zwraca opis błędu o numerze podanym jako parametr. Ważne jest, że funkcji tych nie można używać bezpośrednio w wyrażenia SQL. Wartość zwracane przez te funkcje należy przypisać do zmiennych i następnie dopiero te zmienne wykorzystać w wyrażeniach SQL.
Przykład:
DECLARE sql_code NUMBER; sql_errm VARCHAR2(200); BEGIN ... EXCEPTION ... WHEN OTHERS THEN sql_code:=SQLCODE; sql_errm:=SUBSTR(SQLERRM,1,100); Insert Into logs Values(sql_code,sql_errm); END;
Do przypisania kodu błedu do zdefiniowanego przez użytkownika wyjątku stosujemy wyrażenie PRAGMA EXCEPTION_INIT w bloku DECLARE.
Przykład:
DECLARE my_exception EXCEPTION; PRAGMA EXCEPTION_INIT(my_exception,-80) ; BEGIN ... EXCEPTION WHEN my_exception THEN ... END;
Funkcja raise_application_error
Aby ułatwić komunikację aplikacji z użytkownikiem system Oracle udostępnia nam funkcję raise_application_error o składni:
raise_application_error(error_number, error_message[,TRUE | FALSE]);
Funkcja ta może być wygenerowana wyłącznie z podprogramu i zwraca do aplikacji błąd użytkownika z jego opisem.
Argumenty tej procedury to :
- error_numberkod błędu z zakresu -20999 do -20000
- error_messageOpis błędu (do 2048 znaków)
Trzeci parametr jest opcjonalny. Jeśli przyjmie on wartość TRUE, błąd jest umieszczany w kolejce wraz z poprzednimi błędami. W przypadku wartości FALSE (wartość domyślna) błąd zastępuje poprzednie błędy.
Przykład:
Create procedure raise_salary(tabid NUMBER, amount NUMBER) AS curr_sal NUMBER; BEGIN Select sal into curr_sal From tab Where id=tabid; IF curr_sal IS NULL THEN raise_application_error(-20101,'Salary is missing'); ELSE Update tab set sal=curr_sal+amount Where id=tabid; END IF; END raise_salary; powrót
Komentarze
Dodaj Komentarz
Newsletter
Jeżeli chcesz być na bieżąco informowany o aktualnościach i poradach IT zapisz się do naszego newslettera.