complete guide pl sql exception handling with examples
このチュートリアルでは、PL SQL例外処理と、例外のタイプ、ユーザー定義およびシステム定義の例外、例外の発生方法などの関連概念について説明します。
に PL / SQL日時形式 の PL / SQLシリーズ 、日時、タイムスタンプ、間隔に関するいくつかの便利な関数について学びました
この記事では、PLSQLでの例外処理について説明します。また、例外の利点とその発生方法についても説明します。
学びから始めましょう!
学習内容:
PLSQL例外処理
エラーまたは警告イベントは例外と呼ばれます。 PL / SQLプログラムの実行時に発生します。 PL / SQLには、エラー状態に対抗する方法が定義されているコードのEXCEPTIONブロックを使用して、これらの例外状態を処理するメカニズムがあります。
例外には2つのタイプがあります。 それらは以下にリストされています:
- ユーザー定義の例外。
- システム定義の例外。
一般的なシステム定義の例外のいくつかは次のとおりです。 メモリ不足 そして ゼロ除算、 それぞれSTORAGE_ERRORやZERO_DIVIDEのような名前を持っています。ユーザー定義の例外は、パッケージ、サブプログラム、またはコードのPL / SQLブロックの宣言セクション内で宣言され、名前を割り当てる必要があります。
例外が発生すると、実行の自然な流れが停止し、実行はPL / SQLコードの例外セクションを指します。システム定義の例外はデフォルトでスローされますが、ユーザー定義の例外はRAISEキーワードで明示的にスローする必要があります。
したがって、例外処理は、プログラムのコンパイル中ではなく、実行時に発生するエラーの処理に役立ちます。
例外処理の利点
利点は次のとおりです。
- コードに例外処理がない場合は、ステートメントを実行するたびに、実行中のエラーを確認する必要があります。
- コードで例外処理を回避すると、実際のエラーが見落とされ、他のエラーが発生します。
- 例外処理により、コード内の複数の検証をスキップできます。
- コード内のエラーハンドラーを分離することにより、コードの可読性が向上します。
例外処理構文:
DECLARE <> BEGIN < > EXCEPTION <> WHEN excp1 THEN <> WHEN excp2 THEN <> ........ WHEN others THEN <> END;
デフォルトの例外は次のように実行されます 他の人がそれから。
名前の付いたテーブルを考えてみましょう 市民 。
アンドロイドインタビューの質問と回答pdf
SELECT * FROM CITIZEN;
以下に示すSQLステートメントを使用してCITIZENテーブルを作成しました。
CREATE TABLE CITIZEN ( ID INT NOT NULL, NAME VARCHAR (15) NOT NULL, AGE INT NOT NULL, PRIMARY KEY (ID) );
以下に示すSQLステートメントを使用して、このテーブルに値を挿入します。
INSERT INTO CITIZEN VALUES (1, 'ZAKS', 14); INSERT INTO CITIZEN VALUES (8, 'RANNY', 75); INSERT INTO CITIZEN VALUES (5, 'TOM', 37);
例外処理を伴うコーディング実装:
DECLARE citizen_id citizen.id%type; citizen_name citizen.name%type; citizen_age citizen.age%type := 9; BEGIN SELECT id, name INTO citizen_id, citizen_name FROM citizen WHERE age = citizen_age; DBMS_OUTPUT.PUT_LINE ('Citizen id is: '|| citizen_id); DBMS_OUTPUT.PUT_LINE ('Citizen name is: '|| citizen_name); EXCEPTION WHEN no_data_found THEN dbms_output.put_line ('No citizen detail found'); WHEN others THEN dbms_output.put_line ('Errors'); END; /
上記のコードの出力:
上記のコードでは、CITIZENテーブルに9歳の市民がいないため、実行時例外が発生します。
PL / SQLで例外を発生させる
開発者は、キーワードRAISEを使用して、明示的に例外を発生させることができます。
例外発生の構文:
DECLARE exception_n EXCEPTION; BEGIN IF condition THEN RAISE exception_n; END IF; EXCEPTION WHEN exception_n THEN <>; END;
ここで、exception_nは、発生させている例外の名前です。このようにして、ユーザー定義とシステム定義の両方の例外を発生させることができます。
ユーザー定義の例外
開発者は独自の例外を作成し、それらを使用してエラーを処理できます。これらはサブプログラムの宣言部分で作成でき、そのサブプログラム内でのみアクセスできます。
パッケージレベルで作成された例外は、パッケージにアクセスするたびに使用できます。 RAISEキーワードを使用すると、ユーザー定義の例外を発生させることができます。
ユーザー定義エラーの構文は次のとおりです。
YouTubeの動画をダウンロードするのに最適なアプリは何ですか
DECLARE exception_n EXCEPTION;
ここでは、 exception_n 私たちが提起している例外の名前です。したがって、名前の後にEXCEPTIONキーワードを指定することで、例外を宣言できます。例外は、変数が宣言されるのと同様の方法で宣言できます。ただし、例外は予期しない状態であり、データ項目ではありません。
PL / SQLの例外の範囲:
PL / SQL例外のスコープのルールは次のとおりです。
- 同じコードブロックで例外を複数回宣言することはできません。ただし、2つの異なるコードブロックで同じ例外を宣言できます。
- コードのブロック内で宣言された例外は、そのブロック内でローカルであり、すべてのサブブロックに対してグローバルです。
- サブブロック内でグローバル例外を再度宣言すると、ローカル宣言が無効になります。
CITIZENという名前のテーブルをもう一度考えてみましょう。
ユーザー定義の例外を伴うコード実装:
DECLARE firstexception EXCEPTION; j NUMBER; BEGIN FOR j IN (SELECT * FROM CITIZEN) LOOP IF j.ID = 8 THEN RAISE firstexception; END IF; END LOOP; EXCEPTION WHEN firstexception THEN dbms_output.put_line ('Citizen with ID 8 already exist in table.'); END; /
上記のコードの出力:
事前定義された例外
データベースルールに違反するか、システムに依存するしきい値を超えると、内部例外が自動的にスローされます。これらのエラーにはすべて一意の番号があり、すべての例外は名前として定義されています。 例えば、 SELECTクエリが行をフェッチしない場合、PL / SQLはNO_DATA_FOUND事前定義例外をスローします。
PL / SQLの事前定義されたすべての例外は、PL / SQL環境を処理するSTANDARDパッケージで宣言されています。
例外 | Oracleエラー | SQLコード | 説明 |
---|---|---|---|
無効な番号 | 時間-01722 | -1722 | 文字列が無効な数値を表しているため、文字列から数値への変換が渡されない場合、この例外が発生します。 |
ACCESS_INTO_NULL | 今-06530 | -6530 | nullオブジェクトに値が自然に割り当てられている場合、この例外が発生します。 |
CASE_NOT_FOUND | 今-06592 | -6592 | この例外は、WHEN句のオプションが選択されておらず、ELSE句が存在しない場合に発生します。 |
COLLECTION_IS_NULL | NOW-06531 | -6531 | この例外は、コードがEXISTS以外のコレクションメソッドを、初期化されていないネストされたテーブルまたはVARRAYに適用しようとしたときに発生します。コードが初期化されていないネストされたテーブルまたはVARRAYに値を割り当てようとした場合にも発生する可能性があります。 |
DUP_VAL_ON_INDEX | 時間-00001 | -1 | この例外は、一意のインデックスによって制約されている列に重複する値を格納しようとすると発生します。 |
CURSOR_ALREADY_OPEN | 今-06511 | -6511 | この例外は、コードがすでに開いているカーソルを開こうとした場合に発生します。 |
INVALID_CURSOR | 時間-01001 | -1001 | この例外は、許可されていないカーソルに対していくつかの操作を実行しようとすると発生します。たとえば、すでに閉じているカーソルを閉じようとしています。 |
LOGIN_DENIED | 時間-01017 | -1017 | この例外は、プログラムが不適切なユーザー名とパスワードを使用してデータベースにログオンしようとした場合に発生します。 |
何もデータが見つかりませんでした | 時間-01403 | 100 | この例外は、SELECTクエリが行をフェッチしない場合に発生します。 |
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 | この例外は、SELECTクエリが複数の行をフェッチする場合に発生します。 |
SUBSCRIPT_BEYOND_COUNT | 今-06533 | -6533 | この例外は、添え字がコレクション内の要素数の総数よりも多い場合に発生します。 |
SUBSCRIPT_OUTSIDE_LIMIT | 今-06532 | -6532 | この例外は、添え字がしきい値の範囲を超えている場合に発生します。 |
SYS_INVALID_ROWID | ORA-01410 | -1410 | この例外は、文字ストリングが無効な行IDを表しているために、文字ストリングからユニバーサル行IDへの変換が渡されない場合に発生します。 |
TIMEOUT_ON_RESOURCE | ORA-00051 | -51 | この例外は、Oracleがリソースを待機している場合に発生します。 |
VALUE_ERROR | ORA-06502 | -6502 | この例外は、プログラムで数学、変換、切り捨てエラーが発生した場合に発生します。 |
ZERO_DIVIDE | ORA-01476 | -1476 | この例外は、数値を0で除算しようとすると発生します。 |
よくある質問と回答
Q#1)PL / SQLで事前定義された例外とは何ですか?
回答: プログラムによるデータベースのルールへの違反がある場合、事前定義された例外がPL / SQLによって自動的にスローされます。
Q#2)PL / SQL例外処理とは何ですか?なぜそれが必要なのですか?
回答: プログラム内のエラーまたは予期しないイベントは、例外と呼ばれます。プログラムの通常の実行フローを停止します。 PL / SQLでは、例外はコード内のEXCEPTIONブロック内で処理され、例外に対する適切なアクションはそのブロック内に記述されています。
Q#3)例外処理とはどういう意味ですか?
回答: これは、コードの実行中に発生する可能性のある予期しないイベントに対応する方法です。
Javaでリストを作成する方法
Q#4)エラー処理の2つの形式は何ですか?
回答: エラー処理の2つの形式は次のとおりです。 コンパイル時エラー そして ランタイムエラー 。実行時エラーは、不適切なデータまたはロジックが原因でプログラムの実行中に発生します。コンパイル時エラーは、コードのコンパイル中にキャッチされます。
Q#5)エラーと例外の違いは何ですか?
回答: 例外は、try / catchブロックを使用して処理されるインシデントであり、プログラム実行のコンパイル時と実行時の両方で発生する可能性があります。一方、エラーは実行時にのみ発生します。
結論
このチュートリアルでは、プログラムの例外を管理するために不可欠なPL / SQLのいくつかの基本的な概念について詳しく説明しました。
以下のトピックについて説明しました。
- 例外。
- 例外の種類。
- いくつかの事前定義された例外。
次のチュートリアルでは、PL / SQLトランザクション、OOPSの概念、およびその他の多くの関連トピックについて説明します。
推奨読書
- コード例を使用したC#例外処理チュートリアル
- Javaの例外と例を使用した例外処理
- PL SQLパッケージ:例を含むOracle PL / SQLパッケージのチュートリアル
- C ++での例外処理
- 例のある初心者向けのPLSQLチュートリアル| PL / SQLとは
- 例を含むPLSQLレコードのチュートリアル