sql >> Databáze >  >> RDS >> Oracle

Oracle:jaká je situace pro použití RAISE_APPLICATION_ERROR?

RAISE_APPLICATION_ERROR má dvě použití. První je nahradit obecné zprávy o výjimkách Oracle našimi vlastními, smysluplnějšími zprávami. Druhým je vytvoření vlastních výjimečných podmínek, kdy by je Oracle nevyhodil.

Následující postup ilustruje obě použití. Prosazuje obchodní pravidlo, že v budoucnu nelze najímat nové zaměstnance. Přepisuje také dvě výjimky Oracle. Jedním z nich je DUP_VAL_ON_INDEX, který je vyvolán jedinečným klíčem na EMP(ENAME) . Druhým je uživatelsky definovaná výjimka vyvolaná při cizím klíči mezi EMP(MGR) a EMP(EMPNO) je porušeno (protože manažer musí být stávajícím zaměstnancem).

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

Jak to vypadá:

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

Všimněte si odlišného výstupu ze dvou volání RAISE_APPLICATION_ERROR v bloku EXCEPTIONS. Nastavení volitelného třetího argumentu na hodnotu TRUE znamená, že RAISE_APPLICATION_ERROR zahrnuje spouštěcí výjimku v zásobníku, což může být užitečné pro diagnostiku.

Další užitečné informace naleznete v Uživatelské příručce PL/SQL.



  1. Dotazování PostgreSQL pomocí Npgsql a Entity Framework pomocí unaccent

  2. Jak napíšete dotaz bez rozlišení velkých a malých písmen pro MySQL i Postgres?

  3. SQL Server 2008 – Získejte omezení tabulky

  4. Úžasných 24 otázek souběžného manažerského rozhovoru