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

PL/SQLで例外を処理する方法を学ぶ

    プログラマーであれば、例外処理がプログラミング言語の不可欠な部分であるという概念に精通しているかもしれません。エラーは避けられず、私たちの最も賢い人でさえコードを書いているときに間違いを犯す可能性があるので、私たちはそれらを処理する方法に精通している必要があります。この記事では、特にPL/SQLでの例外処理について学習します。

    この記事で取り上げるトピックは次のとおりです:

    • 例外とは何ですか?
    • 例外処理の構文
    • 例外の種類
      • システム定義
      • 名前付きシステムの例外
      • 名前のないシステムの例外
    • ユーザー定義
      • ユーザー定義関数を宣言する手順
      • ユーザー定義関数の例

    例外とは何ですか?

    実行時にプログラム命令の通常のフローを中断する異常な状態またはイベント、または簡単に言えば例外はエラーです。

    PL/SQLでの例外処理の構文

    DECLARE
    <declarations section>
    BEGIN
    <executable command(s)>
    EXCEPTION
    <exception handling goes here >
    WHEN exception1 THEN
    exception1-handling-statements
    WHEN exception2&nbsp; THEN
    exception2-handling-statements
    WHEN exception3 THEN
    exception3-handling-statements
    ........
    
    WHEN others THEN
    exception3-handling-statements
    END;
    

    ここでは、処理したい数の例外をリストできます。デフォルトの例外は、「WHENothersTHEN」を使用して処理されます

    PL/SQLでの例外処理の例

    以下のプログラムは、IDが与えられた学生の名前と住所を表示します。データベースにID値8の学生がいないため、プログラムは実行時例外NO_DATA_FOUNDを発生させます。これは、EXCEPTIONブロックにキャプチャされます。

    DECLARE 
       s_id studentS.id%type := 8; 
       s_name studentS.Name%type; 
       s_loc studentS.loc%type; 
    BEGIN 
       SELECT  name, loation INTO  s_name, s_loc 
       FROM students 
       WHERE id = s_id;  
       DBMS_OUTPUT.PUT_LINE ('Name: '||  s_name); 
       DBMS_OUTPUT.PUT_LINE ('Location: ' || s_loc);
    EXCEPTION 
       WHEN no_data_found THEN 
          dbms_output.put_line('No such student!'); 
       WHEN others THEN 
          dbms_output.put_line('Oops, Error!'); 
    END; 
    

    出力

    No such student!
    PL/SQL procedure successfully completed.  
    

    ここでは、処理したい数の例外をリストできます。デフォルトの例外は、「他の人がその後」を使用して処理されます ’

    PL/SQLの例外のタイプ

    • システム定義
    • ユーザーに反抗

    次に、PL / SQLでの例外処理に関するこの記事では、これらのタイプの両方について詳しく説明します。

    システム定義

    Oracleサーバーによって暗黙的に定義および保守されるこれらの例外は、主にOracle標準パッケージで定義されます。プログラム内で例外が発生するたびに、Oracleサーバーは、Oracle標準パッケージで使用可能な例外のセットから適切な例外を照合して識別します。基本的に、これらの例外はPL / SQLで事前定義されており、特定のデータベースルールに違反した場合に発生します。 。

    システム定義の例外 さらに2つのカテゴリに分類されます:

    • 名前付きシステムの例外
    • 名前のないシステムの例外

    名前付きシステムの例外

    指定されたPL / SQL例外は、 PL/SQLの標準パッケージで指定されています したがって、開発者はコードでPL/SQL例外を定義する必要はありません。 PL / SQLには、事前定義された多くの名前付き例外が用意されています。これらの例外は、プログラムによってデータベースルールに違反した場合に実行されます。次の表に、事前定義された重要な例外のいくつかを示します-

    例外 Oracleエラー SQLCODE 説明
    ACCESS_INTO_NULL 06530 -6530 nullオブジェクトに値が自動的に割り当てられると発生します。
    CASE_NOT_FOUND 06592 -6592 CASEステートメントのWHEN句の選択肢が選択されておらず、ELSE句がない場合に発生します。
    COLLECTION_IS_NULL 06531 -6531 プログラムがEXISTS以外の収集メソッドを初期化されていないネストされたテーブルまたはVARRAYに適用しようとした場合、またはプログラムが初期化されていないネストされたテーブルまたはVARRAYの要素に値を割り当てようとした場合に発生します。
    DUP_VAL_ON_INDEX 00001 -1 一意のインデックスを持つ列に重複する値を格納しようとすると発生します。
    INVALID_CURSOR 01001 -1001 開いていないカーソルを閉じるなど、許可されていないカーソル操作を行おうとすると発生します。
    INVALID_NUMBER 01722 -1722 文字列が有効な数値を表していないために文字列の数値への変換が失敗した場合に発生します。
    LOGIN_DENIED 01017 -1017 プログラムが無効なユーザー名またはパスワードを使用してデータベースにログオンしようとすると発生します。
    NO_DATA_FOUND 01403 +100 SELECTINTOステートメントが行を返さない場合に発生します。
    NOT_LOGGED_ON 01012 -1012 データベースに接続せずにデータベース呼び出しが発行された場合に発生します。
    PROGRAM_ERROR 06501 -6501 PL/SQLに内部的な問題がある場合に発生します。
    ROWTYPE_MISMATCH 06504 -6504 互換性のないデータ型の変数でカーソルが値をフェッチすると発生します。
    SELF_IS_NULL 30625 -30625 メンバーメソッドが呼び出されたときに発生しますが、オブジェクトタイプのインスタンスは初期化されていません。
    STORAGE_ERROR 06500 -6500 PL / SQLのメモリが不足した場合、またはメモリが破損した場合に発生します。
    TOO_MANY_ROWS 01422 -1422 SELECTINTOステートメントが複数の行を返す場合に発生します。
    VALUE_ERROR 06502 -6502 算術、変換、切り捨て、またはサイズ制約のエラーが発生した場合に発生します。
    ZERO_DIVIDE 01476 1476 数値をゼロで除算しようとすると発生します。

    CREATE OR REPLACE PROCEDURE add_new_student
          (student _id_in IN NUMBER, student _name_in IN VARCHAR2)
    IS
    BEGIN
           INSERT INTO student (student _id, student _name )
           VALUES ( student _id_in, student _name_in );
    EXCEPTION
           WHEN DUP_VAL_ON_INDEX THEN
     raise_application_error (-20001,'Duplicate student _id');
           WHEN OTHERS THEN
    raise_application_error (-20002,'An error occurred.');
    END;
    

    PL / SQLでの例外処理に関するこの記事に進んで、名前のないシステム例外とは何かを理解しましょう。

    名前のないシステム例外

    Oracleに名前がないシステム例外は、名前のないシステム例外と呼ばれます。これらの例外は頻繁には発生せず、コードと関連するメッセージで記述されます。

    名前のないシステム例外を処理するには、基本的に2つの方法があります。

    1.WHENOTHERS例外ハンドラーの使用

    2.例外コードを名前に関連付け、名前付き例外として使用します。

    名前のないシステム例外に対して実行されるいくつかの手順は次のとおりです。

    • 暗黙的に上げます。
    • 「WHENOthers」で処理されない場合は、明示的に処理する必要があります。
    • 例外を明示的に処理するには、プラグマEXCEPTION_INITを使用して宣言し、例外セクションでユーザー定義の例外名を参照して処理します。

    Pragma EXCEPTION_INITを使用して名前のない例外を処理する例は、この記事の後半で説明されています。 PL / SQLでの例外処理に関するこの記事に進み、ユーザー定義の例外を理解しましょう。

    ユーザー定義

    他のすべてのプログラミング言語と同様に、Oracleでは広告に独自の例外を実装するように宣言することもできます。システム定義の例外とは異なり、これらの例外はPL/SQLブロックで明示的に発生します。

    Oracleデータベースでユーザー定義の例外を宣言する手順

    Oracleデータベースでユーザー定義の例外を定義するには、次の3つの方法があります。

    • EXCEPTIONタイプの変数の使用

    ここでは、コードでEXCEPTIONデータ型の変数を宣言し、RAISEステートメントを使用してプログラムで明示的に発生させることにより、ユーザー定義の例外を宣言できます。

    • PRAGMAEXCEPTION_INIT関数の使用

    EXCEPTIONデータ型の変数を使用して事前定義されていないエラー番号を定義できます

    • RAISE_APPLICATION_ERRORメソッドの使用

    このメソッドを使用すると、独自にカスタマイズしたエラー番号とメッセージを使用して、ユーザー定義の例外を宣言できます。

    これまで、PL/SQLでユーザー定義の例外を発生させる方法について大まかなアイデアが得られたかもしれません。 PL / SQLでの例外処理に関するこの記事では、上記の各メソッドについて例を挙げて学習します。

    この記事の次の記事では、ユーザー定義の例外処理のデモンストレーションを進めましょう。

    ユーザー定義の例外のデモンストレーション

    PL / SQLでの例外処理に関するこの記事に進んで、EXCEPTION型の変数の使用方法を理解しましょう。

    EXCEPTIONタイプの変数の使用

    ユーザー定義の例外を宣言するプロセスは3つの部分に分かれており、これら3つの部分は次のとおりです。

    • 変数例外データ型を宣言する
    • 例外を発生させる
    • 例外を処理する

    上記の手順を詳細に示すコードを書いてみましょう。

    DECLARE
           var_dividend NUMBER :=10;
           var_divisor  NUMBER :=0
           var_result NUMBER;
           ex-DivZero EXCEPTION
    

    上記の宣言ブロックには4つの変数があり、最初の3つは通常の数値のデータ型変数で、4つ目のex_DivZeroは特別な例外のデータ型変数です。 4つ目は、ユーザー定義の例外です。

    DECLARE
           var_dividend NUMBER :=10;
           var_divisor  NUMBER :=0
           var_result NUMBER;
           ex-DivZero EXCEPTION
    

    この匿名ブロックの上記の実行部分は、除数が0の場合にのみ動作します。この場合のように除数がゼロの場合、エラーが発生します。プログラムの制御は次のすべてのステップをスキップし、一致する例外ハンドラーを探します。他のものが見つかった場合は、それに応じてアクションを実行します。それ以外の場合は、プログラムを終了するか、未処理のシステム定義エラーでプロンプトを表示します。

    EXCEPTION WHEN ex_DivZero THEN
    DBMS_OUTPUT.PUT_LINE(‘ ERROR, The divisor can’t be zero’);
    

    これは例外ハンドラーです。ユーザーが除数を0と入力するとすぐに、上記のメッセージ文字列が表示されます。

    最終コード:

    DECLARE
           var_dividend NUMBER :=10;
           var_divisor  NUMBER :=0
           var_result NUMBER;
           ex-DivZero EXCEPTION
    BEGIN
    IF var_divisor =0 THEN
    RAISE ex-DivZero;
    END IF;
    Var_result := var_dividend/var_divisor;
    DBMS_OUTPUT.PUT_LINE (‘Result = ‘ || var_result);
    BEGIN
    IF var_divisor =0 THEN
    RAISE ex-DivZero;
    END IF;
    Var_result := var_dividend/var_divisor;
    DBMS_OUTPUT.PUT_LINE (‘Result = ‘ || var_result);
    END;
    

    PL / SQLでの例外処理に関するこの記事に進み、PRAGMA_EXCEPTION_INITメソッドの使用方法を理解しましょう。

    PRAGMAEXCEPTION_INIT関数の使用

    PRAGMA EXCEPTION_INIT関数では、例外名がOracleエラー番号に関連付けられています。この名前は、エラーの例外ハンドラーの設計に使用できます。ユーザー定義のエラーが多い巨大なプロジェクトの場合、PRAGMAEXCEPTION_INITが最も便利で適切な方法です。

    構文:

    PRAGMA EXCEPTION_INIT(exception_name, -Oracle_error_number);
    

    DECLARE
       deadlock_detected EXCEPTION;
       PRAGMA EXCEPTION_INIT(deadlock_detected, -60);
    BEGIN
     NULL; -- Some operation that causes an ORA-00060 error
    EXCEPTION
       WHEN deadlock_detected THEN
          NULL; -- handle the error
    END;
    

    PRAGMA EXCEPTION_INITは、前述のように、例外名をOracleエラー番号に関連付けるようにコンパイラーに指示します。これにより、内部例外を名前で参照し、その特定のハンドラーを作成できます。エラースタックまたは一連のエラーメッセージが表示された場合、一番上にあるのはトラップして処理できるものです。

    PL / SQLでの例外処理に関するこの記事に進み、RAISE_APPLICATION_ERRORメソッドの使用方法を理解しましょう。

    RAISE_APPLICATION_ERRORメソッドの使用

    これは、Oracleソフトウェアに組み込まれているプロシージャです。この手順を使用して、エラー番号をカスタムエラーメッセージに関連付けることができます。エラー番号とカスタムエラーメッセージの両方を組み合わせることで、エラーが発生したときにOracleによって表示されるデフォルトのエラー文字列に似たエラー文字列を作成できます。 RAISE_APPLICATION_ERRORプロシージャは、DBMS_STANDARDパッケージ内にあります

    構文

    raise_application_error (error_number, message [, {TRUE | FALSE}]);
    

    /* A trigger trg_emp_detail_chk is created.*/
    CREATE OR REPLACE TRIGGER trg_emp_detail_chk
    
    /* The trigger timing is declared as BEFORE UPDATE on the EMPLOYEES table.*/
    Before UPDATE ON employees
    
    DECLARE
    permission_denied EXCEPTION;
    BEGIN
    
    /*Start of the IF condition checking whether the day of the system time is either Saturday or Sunday or not.*/
    IF trim(TO_CHAR(sysdate,'Day')) IN ('Saturday', 'Sunday') THEN
    raise_application_error(-20000, 'You are not authorized to do any modification in the weekends!!');
    
    /* The procedure raise_application_error is called with the first parameter value as -20000 and the second parameter
    with a default text stating that the user is not authorized to do any modification in the weekends. */
    END IF;
    END;
    
    

    これで、「PL/SQLでの例外処理」に関するこの記事は終わりです。このトピックがよく理解され、お役に立てば幸いです。独自のコードを作成し、この記事で説明されている方法を取り入れてみてください。

    このテクノロジーの専門家からトレーニングを受けたい場合は、edurekaの構造化されたトレーニングを選択できます。世界中に25万人以上の満足している学習者のネットワークを持つ信頼できるオンライン学習会社であるEdurekaによるこのMySQLDBA認定トレーニングをチェックしてください。このコースでは、データを管理し、MySQLデータベースを管理するためのコアコンセプトと高度なツールおよびテクニックについてトレーニングします。これには、MySQL Workbench、MySQLサーバー、データモデリング、MySQLコネクタ、データベースデザイン、MySQLコマンドライン、MySQL関数などの概念に関する実践的な学習が含まれます。トレーニングの終わりに、独自のMySQLデータベースを作成および管理し、管理できるようになります。データ。

    質問がありますか?この「PL/SQLでの例外処理」の記事のコメントセクションにその旨を記載してください。できるだけ早くご連絡いたします。


    1. PHPとMySQLのページネーション

    2. ネイティブ動的SQLを使用して実行されたSELECTステートメントの結果を出力するにはどうすればよいですか?

    3. SQLServerデータベースの複数のテーブルの列にデフォルトの制約を追加するスクリプトを生成する方法-SQLServer/TSQLチュートリアルパート94

    4. エラー関係が発生し続ける[TABLE]が存在しません