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

Oracle:hvad er situationen for at bruge RAISE_APPLICATION_ERROR?

Der er to anvendelsesmuligheder for RAISE_APPLICATION_ERROR. Den første er at erstatte generiske Oracle-undtagelsesmeddelelser med vores egne, mere meningsfulde meddelelser. Det andet er at skabe vores egne undtagelsesbetingelser, når Oracle ikke ville smide dem.

Den følgende procedure illustrerer begge anvendelser. Det håndhæver en forretningsregel om, at nye medarbejdere ikke kan ansættes i fremtiden. Det tilsidesætter også to Oracle-undtagelser. Den ene er DUP_VAL_ON_INDEX, som kastes af en unik nøgle på EMP(ENAME) . Den anden er en brugerdefineret undtagelse, når fremmednøglen mellem EMP(MGR) og EMP(EMPNO) krænkes (fordi en leder skal være en eksisterende medarbejder).

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

Sådan ser det ud:

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

Bemærk de forskellige output fra de to kald til RAISE_APPLICATION_ERROR i EXCEPTIONS-blokken. Indstilling af det valgfri tredje argument til TRUE betyder, at RAISE_APPLICATION_ERROR inkluderer den udløsende undtagelse i stakken, hvilket kan være nyttigt til diagnosticering.

Der er mere nyttig information i PL/SQL-brugervejledningen.



  1. Konverter django RawQuerySet til Queryset

  2. 11 måder at finde dublerede rækker, der har en primær nøgle i Oracle

  3. Kører serveren på host localhost (::1) og accepterer TCP/IP-forbindelser på port 5432?

  4. Hvordan genererer man automatisk identitet til en Oracle-database gennem Entity framework?