Существует два варианта использования 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 .