Oracle
 sql >> Database >  >> RDS >> Oracle

Oracle:qual è la situazione per utilizzare RAISE_APPLICATION_ERROR?

Ci sono due usi per RAISE_APPLICATION_ERROR. Il primo è sostituire i messaggi di eccezione Oracle generici con i nostri messaggi più significativi. Il secondo è creare nostre condizioni di eccezione, quando Oracle non le lancerebbe.

La procedura seguente illustra entrambi gli usi. Applica una regola aziendale secondo cui i nuovi dipendenti non possono essere assunti in futuro. Sostituisce anche due eccezioni Oracle. Uno è DUP_VAL_ON_INDEX, che viene generato da una chiave univoca su EMP(ENAME) . L'altra è un'eccezione definita dall'utente generata quando la chiave esterna tra EMP(MGR) e EMP(EMPNO) è violato (perché un manager deve essere un dipendente esistente).

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;
/

Come appare:

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

Notare il diverso output delle due chiamate a RAISE_APPLICATION_ERROR nel blocco EXCEPTIONS. L'impostazione del terzo argomento facoltativo su TRUE significa che RAISE_APPLICATION_ERROR include l'eccezione di attivazione nello stack, che può essere utile per la diagnosi.

Sono disponibili informazioni più utili nella Guida per l'utente di PL/SQL.