Oracle
 sql >> база данни >  >> RDS >> Oracle

Oracle:каква е ситуацията да се използва RAISE_APPLICATION_ERROR?

Има две употреби на RAISE_APPLICATION_ERROR. Първият е да заменим общите съобщения за изключения на Oracle с наши собствени, по-смислени съобщения. Второто е да създадем собствени условия на изключение, когато Oracle не би ги изхвърлил.

Следващата процедура илюстрира и двете употреби. Той налага бизнес правило, че нови служители не могат да бъдат наемани в бъдеще. Той също така отменя две изключения на Oracle. Единият е DUP_VAL_ON_INDEX, който се хвърля от уникален ключ на EMP(ENAME) . Другото е потребителско дефинирано изключение, хвърлено, когато външният ключ между EMP(MGR) и EMP(EMPNO) е нарушен (тъй като мениджър трябва да е съществуващ служител).

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

Как изглежда:

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

Обърнете внимание на различния изход от двете извиквания към RAISE_APPLICATION_ERROR в блока EXCEPTIONS. Задаването на незадължителния трети аргумент на TRUE означава, че RAISE_APPLICATION_ERROR включва задействащото изключение в стека, което може да бъде полезно за диагностика.

Има още полезна информация в Ръководството за потребителя на PL/SQL.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Автоматично увеличение в Oracle без използване на тригер

  2. NVL2 функция в Oracle

  3. Как работи подзаявката в оператора select в oracle

  4. Oracle – Клониране на таблица – Структура, ограничения на данните и всичко останало

  5. Javascript дата към sql обект дата