sql >> Database >  >> RDS >> Oracle

Oracle:wat is de situatie om RAISE_APPLICATION_ERROR te gebruiken?

Er zijn twee toepassingen voor RAISE_APPLICATION_ERROR. De eerste is om generieke Oracle-uitzonderingsberichten te vervangen door onze eigen, meer betekenisvolle berichten. De tweede is om onze eigen uitzonderingsvoorwaarden te creëren, wanneer Oracle ze niet zou weggooien.

De volgende procedure illustreert beide toepassingen. Het dwingt een bedrijfsregel af dat nieuwe werknemers in de toekomst niet kunnen worden aangenomen. Het heft ook twee Oracle-uitzonderingen op. Een daarvan is DUP_VAL_ON_INDEX, die wordt gegenereerd door een unieke sleutel op EMP(ENAME) . De andere is een door de gebruiker gedefinieerde uitzondering die wordt gegenereerd wanneer de externe sleutel tussen EMP(MGR) en EMP(EMPNO) wordt geschonden (omdat een manager een bestaande werknemer moet zijn).

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

Hoe het eruit ziet:

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

Let op de verschillende uitvoer van de twee aanroepen naar RAISE_APPLICATION_ERROR in het EXCEPTIONS-blok. Het optionele derde argument instellen op TRUE betekent dat RAISE_APPLICATION_ERROR de triggering-uitzondering in de stapel opneemt, wat handig kan zijn voor diagnose.

Er is meer nuttige informatie in de PL/SQL Gebruikershandleiding.



  1. Hoe converteer je een volledige MySQL-databasekarakterset en sortering naar UTF-8?

  2. Spotlight Cloud-alarmen aanpassen

  3. PostgreSQL-sharding configureren met ClusterControl

  4. Tuples worden niet opeenvolgend in de databasetabel ingevoegd?