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

Pl/SQLネストされたプロシージャの例外処理

    アプリケーションレベルで「サーバーで何が起こるか」の正確な説明を表示するには、次のことを試してください。手順:

    create or replace procedure p1 is
    ...
    exception
      when <some_error> then
        <do something>
        -- re-raise error:
        raise_application_error(-20001, 'Client with ID '|| ID || ' has no right to perform action "' || ACTION_NAME || '"', true);
    end;
    
    create or replace procedure p2 is
    begin
      p1;
    exception
      when <another_error> then
        <do something>
        -- re-raise error:
        raise_application_error(-20002, 'Action "' || ACTION_NAME || '" is not completed', true);
    end;
    
    create or replace procedure p3 is
    begin
      p2;
    exception
      when <another_error> then
        <do something>
        -- re-raise error:
        raise_application_error(-20003, 'Purchasing of "' || CAR_NAME || '" cancelled', true);
    end;
    

    そしてトップレベルの手順:

    create or replace procedure top_level_procedure is
    begin
      p1;
    exception
      when <one_more_error> then
        <do something>
        raise_application_error(-20004, dbms_utility.format_error_backtrace);
    end;
    

    p1の例外の後 次のようなものが表示されます:

    ORA-20003: Purchasing of "Cool red Ferrari" cancelled
    ORA-20002: Action "car purchase" is not completed
    ORA-20001: Client with ID 123 has no right to perform action "Spent all money of Bill Gates"
    

    プロシージャraise_application_errorの3番目のパラメータ falseを使用 valueは、以前のすべてのエラーメッセージをカットします。手順p3でfalse値を使用する場合 、コードORA-20003のエラーメッセージが1つだけ表示されます。 この例では。

    P. S.また、独自の例外を定義して、WHEN .. THENで使用することもできます。 句。詳細と例は次のとおりです。 https:/ /docs.oracle.com/cd/B28359_01/appdev.111/b28370/errors.htm#LNPLS00704

    P.P.S.ログに記録する方法。ログ手順:

    create or replace procedure log(p_log_message varchar2) is
    pragma autonomous_transaction;
    begin
      insert into log_table(..., log_message) values (..., p_log_message);
      commit;
    end;
    

    通話記録手順:

      when <one_more_error> then
        <do something>
        log(..., dbms_utility.format_error_backtrace);
        raise_application_error(-20004, dbms_utility.format_error_backtrace);
    



    1. mysqlの変数にプロシージャ名がある場合、ストアドプロシージャを呼び出します

    2. MySQLを使用したGrails3.1.0のセットアップ

    3. SQL ServerでCHECK制約を作成する方法(T-SQLの例)

    4. マテリアライズド・ビューを並行性で更新します