sql >> Databasteknik >  >> RDS >> Oracle

Oracle:hur är situationen att använda RAISE_APPLICATION_ERROR?

Det finns två användningsområden för RAISE_APPLICATION_ERROR. Det första är att ersätta generiska Oracle-undantagsmeddelanden med våra egna, mer meningsfulla meddelanden. Det andra är att skapa våra egna undantagsvillkor, när Oracle inte skulle kasta dem.

Följande procedur illustrerar båda användningarna. Den upprätthåller en affärsregel att nya medarbetare inte kan anställas i framtiden. Det åsidosätter också två Oracle-undantag. Den ena är DUP_VAL_ON_INDEX, som skapas av en unik nyckel på EMP(ENAME) . Den andra är ett användardefinierat undantag som skapas när den främmande nyckeln mellan EMP(MGR) och EMP(EMPNO) kränks (eftersom en chef måste vara en befintlig anställd).

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

Hur det ser ut:

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

Notera de olika utdata från de två anropen till RAISE_APPLICATION_ERROR i EXCEPTIONS-blocket. Att ställa in det valfria tredje argumentet till TRUE innebär att RAISE_APPLICATION_ERROR inkluderar det utlösande undantaget i stacken, vilket kan vara användbart för diagnos.

Det finns mer användbar information i PL/SQL User's Guide.



  1. SQLSTATE[HY000] [1045] Åtkomst nekad för användaren 'användarnamn'@'localhost' med CakePHP

  2. Så här navigerar du i Access 2019-öppningsarbetsytan

  3. Hur man väljer den första raden i varje GRUPP FÖR Grupp

  4. Kan ett dödläge uppstå med samma åtkomstmetod?