あなたがプログラマーなら、例外処理の概念に精通しているかもしれません。 。エラーは避けられず、私たちの最も賢い人でさえコードを書くときに間違いを犯す可能性があるので、私たちはそれらを処理する方法に精通している必要があります。この記事では、特にPL / SQLでの例外処理について学習します。
以下は、この記事で取り上げられているトピックです。
例外とは何ですか?
実行時にプログラム命令の通常のフローを中断する異常な状態またはイベント、または簡単に言えば例外はエラーです。
PL / SQLでの例外処理の構文
DECLARE BEGIN EXCEPTION 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 student 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
出力
そのような学生はいません! PL / SQLプロシージャが正常に完了しました。
ここでは、処理したい数の例外をリストできます。デフォルトの例外は、 ‘を使用して処理されます 他の人が '
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 | のWHEN句の選択肢がない場合に発生します。 CASEステートメント が選択されており、ELSE句はありません。 |
COLLECTION_IS_NULL | 06531 | -6531 | これは、プログラムがEXISTS以外の収集メソッドを初期化されていないネストされたテーブルまたはVARRAYに適用しようとした場合、またはプログラムが初期化されていないネストされたテーブルまたはVARRAYの要素に値を割り当てようとした場合に発生します。 |
DUP_VAL_ON_INDEX | 00001 | -1 | 重複する値を一意のインデックスを持つ列に格納しようとすると発生します。 |
INVALID_CURSOR | 01001 | -1001 | 開いていないカーソルを閉じるなど、許可されていないカーソル操作を行おうとすると発生します。 |
無効な番号 | 01722 | -1722 | 文字列が有効な数値を表していないために文字列の数値への変換が失敗した場合に発生します。 |
LOGIN_DENIED | 01017 | -1017 | プログラムが無効なユーザー名またはパスワードでデータベースにログオンしようとすると発生します。 |
何もデータが見つかりませんでした | 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年 | 数値をゼロで除算しようとすると発生します。 |
例
作成または置換手順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_ )その他の場合raise_application_error(-20002、「エラーが発生しました。」)END
PL / SQLでの例外処理に関するこの記事に進んで、名前のないシステム例外とは何かを理解しましょう。
名前のないシステム例外
Oracleに名前がないシステム例外は、名前のないシステム例外と呼ばれます。これらの例外は頻繁には発生せず、コードと関連するメッセージで記述されます。
名前のないシステム例外を処理するには、基本的に2つの方法があります。
1. WHENOTHERS例外ハンドラーの使用
2.例外コードを名前に関連付け、それを名前付き例外として使用します。
名前のないシステム例外に対して実行されるいくつかの手順は次のとおりです。
- それらを暗黙的に上げます。
- 「WHENOthers」で処理されない場合は、明示的に処理する必要があります。
- 例外を明示的に処理するには、プラグマEXCEPTION_INITを使用して宣言し、例外セクションでユーザー定義の例外名を参照して処理します。
プラグマ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型の変数の使用方法を理解しましょう。
SQLで部分文字列を使用する方法
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の場合にのみ動作します。この場合のように除数がゼロの場合、エラーが発生し、プログラムの制御は次のすべてのステップをスキップし、一致する例外ハンドラーを探します。他のものが見つかった場合は、それに応じてアクションを実行します。それ以外の場合は、プログラムを終了するか、未処理のシステム定義エラーでプロンプトを表示します。
ex_DivZero THEN DBMS_OUTPUT.PUT_LINE( ‘エラー、除数をゼロにすることはできません’)の場合の例外
これは例外ハンドラです。ユーザーが除数を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)BEGINNULL-ORA-00060エラーを引き起こすいくつかの操作EXCEPTIONWHEN deadlock_detected THENNULL-エラーを処理するEND
PRAGMA EXCEPTION_INITは、前述のように、例外名をOracleエラー番号に関連付けるようにコンパイラに指示します。これにより、内部例外を名前で参照し、その特定のハンドラーを作成できます。エラースタックまたは一連のエラーメッセージが表示された場合、一番上にあるのはトラップして処理できるものです。
PL / SQLでの例外処理に関するこの記事に進み、RAISE_APPLICATION_ERRORメソッドの使用方法を理解しましょう。
RAISE_APPLICATION_ERRORメソッドの使用
これは、Oracleソフトウェアに組み込まれている手順です。この手順を使用して、エラー番号をカスタムエラーメッセージに関連付けることができます。エラー番号とカスタムエラーメッセージの両方を組み合わせることで、エラーが発生したときにオラクルが表示するデフォルトのエラー文字列に似たエラー文字列を作成できます。 RAISE_APPLICATION_ERRORプロシージャは、DBMS_STANDARDパッケージ内にあります
構文
raise_application_error(error_number、message [、TRUE])
例
/ *トリガーtrg_emp_detail_chkが作成されます。* / CREATE OR REPLACE TRIGGER trg_emp_detail_chk / *トリガーのタイミングはEMPLOYEESテーブルでBEFOREUPDATEとして宣言されます。* /従業員のUPDATEの前にDECLAREpermission_denied EXCEPTION BEGIN / * IF条件の開始でシステム時刻の日は、土曜日か日曜日かどうかです。* / IF trim(TO_CHAR(sysdate、 'Day'))IN( 'Saturday'、 'Sunday')THEN raise_application_error(-20000、 'あなたには許可されていません週末の変更!! ')/ *プロシージャraise_application_errorは、最初のパラメータ値を-20000として呼び出し、2番目のパラメータをデフォルトのテキストで呼び出して、ユーザーが週末に変更を行うことを許可されていないことを示します。 * / END IF END
これで、「PL / SQLでの例外処理」に関するこの記事は終わりです。このトピックがよく理解され、お役に立てば幸いです。独自のコードを作成し、この記事で説明されている方法を組み込んでみてください。
このテクノロジーの専門家からトレーニングを受けたい場合は、edurekaからの構造化トレーニングを選択できます。これをチェックしてください 25万人以上の満足した学習者のネットワークを持つ信頼できるオンライン学習会社であるEdurekaが世界中に広がっています。このコースでは、データを管理し、MySQLデータベースを管理するためのコアコンセプトと高度なツールおよびテクニックについて学習します。これには、MySQL Workbench、MySQL Server、データモデリング、MySQLコネクタ、データベースデザイン、MySQLコマンドライン、MySQL関数などの概念に関する実践的な学習が含まれます。トレーニングの終わりに、独自のMySQLデータベースを作成および管理して管理できるようになります。データ。
質問がありますか?この「PL / SQLでの例外処理」の記事のコメントセクションにその旨を記載してください。できるだけ早くご連絡いたします。