Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Oracle:tình huống sử dụng RAISE_APPLICATION_ERROR là gì?

Có hai cách sử dụng cho RAISE_APPLICATION_ERROR. Đầu tiên là thay thế các thông báo ngoại lệ Oracle chung chung bằng các thông điệp riêng, có ý nghĩa hơn của chúng ta. Thứ hai là tạo ra các điều kiện ngoại lệ của riêng chúng tôi, khi Oracle sẽ không ném chúng.

Quy trình sau đây minh họa cả hai cách sử dụng. Nó thực thi một quy tắc kinh doanh rằng nhân viên mới không được thuê trong tương lai. Nó cũng ghi đè hai ngoại lệ Oracle. Một là DUP_VAL_ON_INDEX, được cung cấp bởi một khóa duy nhất trên EMP(ENAME) . Cái còn lại là một ngoại lệ do người dùng xác định được ném ra khi khóa ngoại giữa EMP(MGR)EMP(EMPNO) bị vi phạm (vì người quản lý phải là nhân viên hiện tại).

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

Nó trông như thế nào:

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

Lưu ý kết quả đầu ra khác nhau từ hai lệnh gọi tới RAISE_APPLICATION_ERROR trong khối EXCEPTIONS. Đặt đối số thứ ba tùy chọn thành TRUE có nghĩa là RAISE_APPLICATION_ERROR bao gồm ngoại lệ kích hoạt trong ngăn xếp, có thể hữu ích cho việc chẩn đoán.

Có nhiều thông tin hữu ích hơn trong Hướng dẫn sử dụng 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. Cách kết nối với Oracle bằng Tên dịch vụ thay vì SID

  2. có thể có trình tạo chuỗi chữ và số trong sql không

  3. Sự khác biệt giữa BYTE và CHAR trong các kiểu dữ liệu cột

  4. ORA-00054:tài nguyên bận và có được với NOWAIT được chỉ định

  5. Cách gửi email bằng Oracle 10 g Forms