Има две употреби на RAISE_APPLICATION_ERROR. Първият е да заменим общите съобщения за изключения на Oracle с наши собствени, по-смислени съобщения. Второто е да създадем собствени условия на изключение, когато Oracle не би ги изхвърлил.
Следващата процедура илюстрира и двете употреби. Той налага бизнес правило, че нови служители не могат да бъдат наемани в бъдеще. Той също така отменя две изключения на Oracle. Единият е DUP_VAL_ON_INDEX, който се хвърля от уникален ключ на EMP(ENAME)
. Другото е потребителско дефинирано изключение, хвърлено, когато външният ключ между EMP(MGR)
и EMP(EMPNO)
е нарушен (тъй като мениджър трябва да е съществуващ служител).
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;
/
Как изглежда:
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
Обърнете внимание на различния изход от двете извиквания към RAISE_APPLICATION_ERROR в блока EXCEPTIONS. Задаването на незадължителния трети аргумент на TRUE означава, че RAISE_APPLICATION_ERROR включва задействащото изключение в стека, което може да бъде полезно за диагностика.
Има още полезна информация в Ръководството за потребителя на PL/SQL.