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
Zachęcam do przedstawienia swoich uwag i opinii w polu komentarzy.

Komentarze

Dodaj Komentarz