Istnieją dwa zastosowania RAISE_APPLICATION_ERROR. Pierwszym z nich jest zastąpienie ogólnych komunikatów o wyjątkach Oracle naszymi własnymi, bardziej znaczącymi komunikatami. Drugim jest stworzenie własnych warunków wyjątków, gdy Oracle ich nie wyrzuci.
Poniższa procedura ilustruje oba zastosowania. Wymusza biznesową zasadę, że nowi pracownicy nie mogą być zatrudniani w przyszłości. Zastępuje również dwa wyjątki Oracle. Jednym z nich jest DUP_VAL_ON_INDEX, który jest generowany przez unikalny klucz w EMP(ENAME)
. Drugi to wyjątek zdefiniowany przez użytkownika, generowany, gdy klucz obcy między EMP(MGR)
i EMP(EMPNO)
zostało naruszone (ponieważ kierownik musi być istniejącym pracownikiem).
create or replace procedure new_emp
( p_name in emp.ename%type
, p_sal in emp.sal%type
, p_job in emp.job%type
, p_dept in emp.deptno%type
, p_mgr in emp.mgr%type
, p_hired in emp.hiredate%type := sysdate )
is
invalid_manager exception;
PRAGMA EXCEPTION_INIT(invalid_manager, -2291);
dummy varchar2(1);
begin
-- check hiredate is valid
if trunc(p_hired) > trunc(sysdate)
then
raise_application_error
(-20000
, 'NEW_EMP::hiredate cannot be in the future');
end if;
insert into emp
( ename
, sal
, job
, deptno
, mgr
, hiredate )
values
( p_name
, p_sal
, p_job
, p_dept
, p_mgr
, trunc(p_hired) );
exception
when dup_val_on_index then
raise_application_error
(-20001
, 'NEW_EMP::employee called '||p_name||' already exists'
, true);
when invalid_manager then
raise_application_error
(-20002
, 'NEW_EMP::'||p_mgr ||' is not a valid manager');
end;
/
Jak to wygląda:
SQL> exec new_emp ('DUGGAN', 2500, 'SALES', 10, 7782, sysdate+1)
BEGIN new_emp ('DUGGAN', 2500, 'SALES', 10, 7782, sysdate+1); END;
*
ERROR at line 1:
ORA-20000: NEW_EMP::hiredate cannot be in the future
ORA-06512: at "APC.NEW_EMP", line 16
ORA-06512: at line 1
SQL>
SQL> exec new_emp ('DUGGAN', 2500, 'SALES', 10, 8888, sysdate)
BEGIN new_emp ('DUGGAN', 2500, 'SALES', 10, 8888, sysdate); END;
*
ERROR at line 1:
ORA-20002: NEW_EMP::8888 is not a valid manager
ORA-06512: at "APC.NEW_EMP", line 42
ORA-06512: at line 1
SQL>
SQL> exec new_emp ('DUGGAN', 2500, 'SALES', 10, 7782, sysdate)
PL/SQL procedure successfully completed.
SQL>
SQL> exec new_emp ('DUGGAN', 2500, 'SALES', 10, 7782, sysdate)
BEGIN new_emp ('DUGGAN', 2500, 'SALES', 10, 7782, sysdate); END;
*
ERROR at line 1:
ORA-20001: NEW_EMP::employee called DUGGAN already exists
ORA-06512: at "APC.NEW_EMP", line 37
ORA-00001: unique constraint (APC.EMP_UK) violated
ORA-06512: at line 1
Zwróć uwagę na różne dane wyjściowe z dwóch wywołań RAISE_APPLICATION_ERROR w bloku EXCEPTIONS. Ustawienie opcjonalnego trzeciego argumentu na TRUE oznacza, że RAISE_APPLICATION_ERROR zawiera wyjątek wyzwalający na stosie, co może być przydatne w diagnostyce.
Więcej przydatnych informacji można znaleźć w Przewodniku użytkownika PL/SQL.