sql >> データベース >  >> RDS >> Oracle

Oracle:RAISE_APPLICATION_ERRORを使用する状況はどうなっていますか?

    RAISE_APPLICATION_ERRORには2つの用途があります。 1つは、一般的なOracle例外メッセージを独自のより意味のあるメッセージに置き換えることです。 2つ目は、Oracleが例外条件をスローしない場合に、独自の例外条件を作成することです。

    次の手順は、両方の使用法を示しています。これは、将来、新入社員を雇用できないというビジネスルールを適用します。また、2つのOracle例外をオーバーライドします。 1つはDUP_VAL_ON_INDEXで、これはEMP(ENAME)の一意のキーによってスローされます 。もう1つは、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
    

    EXCEPTIONSブロックのRAISE_APPLICATION_ERRORへの2つの呼び出しからの異なる出力に注意してください。オプションの3番目の引数をTRUEに設定すると、RAISE_APPLICATION_ERRORにトリガー例外がスタックに含まれ、診断に役立ちます。

    PL/SQLユーザーズガイドにはさらに役立つ情報があります。



    1. データベースの監視-SCUMMダッシュボードを使用したPrometheusのトラブルシューティング

    2. MySQL Galeraクラスターストリーミングレプリケーションのガイド:パート1

    3. Postgresのselectステートメントで式を評価する方法

    4. グループ化されたMySQLデータから最新の日付を取得する