PL/SQLは、ランタイムエラーを優雅に管理し、アプリケーションのクラッシュを防ぐための堅牢な例外処理メカニズムを提供します。このメカニズムのコアは、PL/SQLブロック内のEXCEPTION
ブロックを中心に展開します。このブロックは、前のBEGIN
ブロックの実行中に発生する例外をキャッチおよび処理するために使用されます。
基本構造は次のようになります:
<code class="sql">DECLARE -- Declare variables BEGIN -- Your PL/SQL code here EXCEPTION WHEN OTHERS THEN -- Handle any unhandled exception WHEN NO_DATA_FOUND THEN -- Handle the NO_DATA_FOUND exception WHEN ZERO_DIVIDE THEN -- Handle the ZERO_DIVIDE exception WHEN TOO_MANY_ROWS THEN -- Handle the TOO_MANY_ROWS exception -- ... other WHEN clauses for specific exceptions ... END; /</code>
WHEN OTHERS
WHEN
予期しないプログラムの終了を防ぐためにこれを含めることが重要ですが、エラーの原因を特定するために慎重にロギングして使用する必要があります。一般に、可能な限り、より有益なエラーメッセージとターゲットを絞った回復戦略のために、可能な限り特定の例外を処理することをお勧めします。適切なロギングのないWHEN OTHERS
使用します。
PL/SQLにはいくつかの事前定義された例外タイプがあり、それぞれが特定の種類のエラーを表します。最も一般的なものの一部は次のとおりです。
NO_DATA_FOUND
:ステートメントSELECT INTO
ときに掲載されています。これは、特定のエラーメッセージによって簡単に識別されます。ZERO_DIVIDE
:ゼロで分割する試みがなされたときに提起されました。繰り返しますが、エラーメッセージは明確です。TOO_MANY_ROWS
:ステートメントSELECT INTO
複数の行を返すと上げられます。これは、クエリのWHERE
句の欠陥を示しています。DUP_VAL_ON_INDEX
:重複した値を一意のインデックスに挿入する試みがなされたときに提起されました。INVALID_NUMBER
:非数値文字列を数値に変換しようとしたときに掲示されます。VALUE_ERROR
:誤ったデータ型を変数に割り当てようとするなど、さまざまなデータ型に関連するエラーに対して提起されます。CURSOR_ALREADY_OPEN
:既に開いているカーソルを開こうとするときに育てられました。OTHERS
:明示的に処理されていない例外のキャッチオール。これらの例外を識別するには、通常、データベースによって返されたエラーメッセージを調べることが含まれます。 Oracleは、例外タイプとその原因をよく特定する詳細なエラーメッセージを提供します。この情報には、 EXCEPTION
ブロック内でSQLCODE
(数値エラーコードを返す)とSQLERRM
(テキストエラーメッセージを返す)を使用してアクセスできます。
効果的なデバッグには、エラー処理とロギングの改善が重要です。 PL/SQLエラー処理を強化する方法は次のとおりです。
詳細なロギング:一般的なエラーメッセージを単に表示する代わりに、以下を含む詳細情報を記録します。
SQLCODE
およびSQLERRM
)。DBMS_OUTPUT
に依存する代わりに、専用のロギングメカニズム(データベース内のログテーブルに書き込む)を使用します。 DBMS_OUTPUT
、テストと開発に適していますが、生産システムには適していません。RAISE_APPLICATION_ERROR
を使用してこれらの例外を提起できます。強化されたロギングの例:
<code class="sql">PROCEDURE my_procedure(p_input IN NUMBER) IS v_result NUMBER; BEGIN -- ... your code ... EXCEPTION WHEN OTHERS THEN INSERT INTO error_log (error_time, procedure_name, sqlcode, sqlerrm, input_parameter) VALUES (SYSTIMESTAMP, 'MY_PROCEDURE', SQLCODE, SQLERRM, p_input); COMMIT; RAISE; -- Re-raise the exception to be handled by a calling procedure, if necessary. END; /</code>
堅牢なアプリケーション動作を確保するには、次のベストプラクティスに従ってください。
WHEN OTHERS
だけに頼ることは避けてください。可能であれば、より正確なエラー処理のために特定の例外を処理します。RAISE
を使用してください: RAISE
例外を再レイズし、呼び出し手順を処理できるようにします。それを戦略的に使用して、コールスタックの例外を伝播します。ROLLBACK
を使用して、操作が失敗した場合にトランザクション中に行われた変更を元に戻します。これにより、データの整合性が保証されます。これらのガイドラインに従うことにより、PL/SQLアプリケーションの堅牢性と信頼性を大幅に改善できます。効果的な例外処理は、保守可能でユーザーフレンドリーなアプリケーションを構築するために重要です。
以上がPL/SQLで例外を処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。