Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Oracle:bagaimana situasinya menggunakan RAISE_APPLICATION_ERROR?

Ada dua kegunaan untuk RAISE_APPLICATION_ERROR. Yang pertama adalah mengganti pesan pengecualian Oracle generik dengan pesan kita sendiri yang lebih bermakna. Yang kedua adalah membuat kondisi pengecualian kita sendiri, ketika Oracle tidak akan membuangnya.

Prosedur berikut mengilustrasikan kedua penggunaan tersebut. Ini memberlakukan aturan bisnis bahwa karyawan baru tidak dapat dipekerjakan di masa depan. Itu juga menimpa dua pengecualian Oracle. Salah satunya adalah DUP_VAL_ON_INDEX, yang dilemparkan oleh kunci unik pada EMP(ENAME) . Yang lainnya adalah pengecualian yang ditentukan pengguna yang dilemparkan ketika kunci asing antara EMP(MGR) dan EMP(EMPNO) dilanggar (karena seorang manajer harus merupakan karyawan yang sudah ada).

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

Bagaimana tampilannya:

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

Perhatikan output yang berbeda dari dua panggilan ke RAISE_APPLICATION_ERROR di blok EXCEPTIONS. Menyetel argumen ketiga opsional ke TRUE berarti RAISE_APPLICATION_ERROR menyertakan pengecualian pemicu di tumpukan, yang dapat berguna untuk diagnosis.

Ada informasi yang lebih berguna dalam Panduan Pengguna 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. Bagaimana Cara Membuat Kunci Asing di Oracle SQL Developer?

  2. masalah dalam menemukan daftar file dalam direktori

  3. URL Oracle yang ditentukan tidak valid:OracleDataSource.makeURL

  4. GROUP BY / kebingungan fungsi agregat dalam SQL

  5. Mengonfigurasi Integrasi Data Pentaho untuk menggunakan Oracle Wallet untuk Oracle Cloud