RAISE_APPLICATION_ERROR má dvě použití. První je nahradit obecné zprávy o výjimkách Oracle našimi vlastními, smysluplnějšími zprávami. Druhým je vytvoření vlastních výjimečných podmínek, kdy by je Oracle nevyhodil.
Následující postup ilustruje obě použití. Prosazuje obchodní pravidlo, že v budoucnu nelze najímat nové zaměstnance. Přepisuje také dvě výjimky Oracle. Jedním z nich je DUP_VAL_ON_INDEX, který je vyvolán jedinečným klíčem na EMP(ENAME)
. Druhým je uživatelsky definovaná výjimka vyvolaná při cizím klíči mezi EMP(MGR)
a EMP(EMPNO)
je porušeno (protože manažer musí být stávajícím zaměstnancem).
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 vypadá:
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
Všimněte si odlišného výstupu ze dvou volání RAISE_APPLICATION_ERROR v bloku EXCEPTIONS. Nastavení volitelného třetího argumentu na hodnotu TRUE znamená, že RAISE_APPLICATION_ERROR zahrnuje spouštěcí výjimku v zásobníku, což může být užitečné pro diagnostiku.
Další užitečné informace naleznete v Uživatelské příručce PL/SQL.