To zależy jak chcesz te wyjątki obsługiwać.
Czy chcesz sygnalizować błędy poza procedurę do kodu wywołującego przez swoje wyjątki, który sobie caller wyłapie i obsłuży ?
Czy też chcesz wyłapywać wyjątki i zwracać błędy np. przez dodatkowy parametr w procedurze, i caller będzie sobie badał
ten parametr (0 - OK, <> 0 - kod błędu) ?
Jeśli to pierwsze, to można np. tak:
create or replace
PROCEDURE proc
(identyfikator NUMBER, wsp OUT NUMBER)
IS
BEGIN
IF identyfikator = 0 THEN
raise_application_error(-20100, 'Nie ma takiego działu' );
ELSIF identyfikator = 1 THEN
raise_application_error(-20101, 'W dziale nie pracuje żaden użytkownik' );
ELSIF identyfikator = 2 THEN
raise_application_error(-20102, 'Nie ma żadnych wypłat w dziale' );
ELSIF identyfikator = 3 THEN
RAISE zero_divide;
ELSE
wsp := 20000;
END IF;
END;
/
SQL> variable x number
SQL> exec proc( 0, :x );
BEGIN proc( 0, :x ); END;
*
ERROR at line 1:
ORA-20100: Nie ma takiego dzialu
ORA-06512: at "TEST.PROC", line 6
ORA-06512: at line 1
SQL> exec proc( 1, :x );
BEGIN proc( 1, :x ); END;
*
ERROR at line 1:
ORA-20101: W dziale nie pracuje zaden uzytkownik
ORA-06512: at "TEST.PROC", line 8
ORA-06512: at line 1
SQL> exec proc( 2, :x );
BEGIN proc( 2, :x ); END;
*
ERROR at line 1:
ORA-20102: Nie ma zadnych wyplat w dziale
ORA-06512: at "TEST.PROC", line 10
ORA-06512: at line 1
SQL> exec proc( 3, :x )
BEGIN proc( 3, :x ); END;
*
ERROR at line 1:
ORA-01476: divisor is equal to zero
ORA-06512: at "TEST.PROC", line 12
ORA-06512: at line 1
SQL> exec proc( 5, :x );
PL/SQL procedure successfully completed.
SQL> print :x
X
----------
20000
A jeśli tę drugą metodą, to np. tak:
create or replace package dzial
is
err_dzielenie_przez_zero CONSTANT number := 1;
err_nie_ma_takiego_dzialu CONSTANT number := 2;
err_w_dziale_nie_ma_pracownika CONSTANT number := 3;
err_nie_ma_wyplat_w_dziale CONSTANT number := 4;
PROCEDURE proc(identyfikator NUMBER, wsp OUT NUMBER, err OUT NUMBER);
end;
/
create or replace package body dzial
is
PROCEDURE proc(identyfikator NUMBER, wsp OUT NUMBER, err OUT NUMBER)
IS
nie_ma_takiego_dzialu EXCEPTION ;
w_dziale_nie_ma_pracownika EXCEPTION ;
nie_ma_wyplat_w_dziale EXCEPTION;
BEGIN
IF identyfikator = 0 THEN
raise nie_ma_takiego_dzialu;
ELSIF identyfikator = 1 THEN
raise w_dziale_nie_ma_pracownika;
ELSIF identyfikator = 2 THEN
raise nie_ma_wyplat_w_dziale;
ELSIF identyfikator = 3 THEN
RAISE zero_divide;
ELSE
wsp := 20000;
END IF;
err := 0;
EXCEPTION
WHEN zero_divide THEN err := err_dzielenie_przez_zero;
WHEN nie_ma_takiego_dzialu THEN err := err_w_dziale_nie_ma_pracownika;
WHEN w_dziale_nie_ma_pracownika THEN err := err_w_dziale_nie_ma_pracownika;
WHEN nie_ma_wyplat_w_dziale THEN err := err_nie_ma_wyplat_w_dziale;
END; -- procedure proc
end; -- package dzial
/
SQL> variable err number
SQL> exec dzial.proc( 2, :x, :err );
PL/SQL procedure successfully completed.
SQL> print :err
ERR
----------
4
SQL> exec dzial.proc( 10, :x, :err );
PL/SQL procedure successfully completed.
SQL> print :err
ERR
----------
0
SQL> print :x
X
----------
20000