RAISE_APPLICATION_ERRORには2つの用途があります。 1つは、一般的なOracle例外メッセージを独自のより意味のあるメッセージに置き換えることです。 2つ目は、Oracleが例外条件をスローしない場合に、独自の例外条件を作成することです。
次の手順は、両方の使用法を示しています。これは、将来、新入社員を雇用できないというビジネスルールを適用します。また、2つのOracle例外をオーバーライドします。 1つはDUP_VAL_ON_INDEXで、これはEMP(ENAME)
の一意のキーによってスローされます 。もう1つは、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
EXCEPTIONSブロックのRAISE_APPLICATION_ERRORへの2つの呼び出しからの異なる出力に注意してください。オプションの3番目の引数をTRUEに設定すると、RAISE_APPLICATION_ERRORにトリガー例外がスタックに含まれ、診断に役立ちます。
PL/SQLユーザーズガイドにはさらに役立つ情報があります。