プログラマーであれば、例外処理がプログラミング言語の不可欠な部分であるという概念に精通しているかもしれません。エラーは避けられず、私たちの最も賢い人でさえコードを書いているときに間違いを犯す可能性があるので、私たちはそれらを処理する方法に精通している必要があります。この記事では、特にPL/SQLでの例外処理について学習します。
この記事で取り上げるトピックは次のとおりです:
- 例外とは何ですか?
- 例外処理の構文
- 例外の種類
- システム定義
- 名前付きシステムの例外
- 名前のないシステムの例外
- システム定義
- ユーザー定義
- ユーザー定義関数を宣言する手順
- ユーザー定義関数の例
例外とは何ですか?
実行時にプログラム命令の通常のフローを中断する異常な状態またはイベント、または簡単に言えば例外はエラーです。
PL/SQLでの例外処理の構文
DECLARE <declarations section> BEGIN <executable command(s)> EXCEPTION <exception handling goes here > WHEN exception1 THEN exception1-handling-statements WHEN exception2 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つのカテゴリに分類されます:
- 名前付きシステムの例外
- 名前のないシステムの例外
名前付きシステムの例外
例外 | 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での例外処理」の記事のコメントセクションにその旨を記載してください。できるだけ早くご連絡いたします。