Il y a deux utilisations pour RAISE_APPLICATION_ERROR. La première consiste à remplacer les messages d'exception Oracle génériques par nos propres messages plus significatifs. La seconde consiste à créer nos propres conditions d'exception, alors qu'Oracle ne les lèverait pas.
La procédure suivante illustre les deux utilisations. Il applique une règle commerciale selon laquelle de nouveaux employés ne peuvent pas être embauchés à l'avenir. Il remplace également deux exceptions Oracle. L'un est DUP_VAL_ON_INDEX, qui est lancé par une clé unique sur EMP(ENAME)
. L'autre est une exception définie par l'utilisateur lancée lorsque la clé étrangère entre EMP(MGR)
et EMP(EMPNO)
est violé (parce qu'un responsable doit être un employé existant).
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;
/
A quoi ça ressemble :
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
Notez la sortie différente des deux appels à RAISE_APPLICATION_ERROR dans le bloc EXCEPTIONS. Définir le troisième argument facultatif sur TRUE signifie que RAISE_APPLICATION_ERROR inclut l'exception de déclenchement dans la pile, ce qui peut être utile pour le diagnostic.
Vous trouverez des informations plus utiles dans le Guide de l'utilisateur PL/SQL.