ホームページ > データベース > Oracle > PL/SQLで例外を処理するにはどうすればよいですか?

PL/SQLで例外を処理するにはどうすればよいですか?

Johnathan Smith
リリース: 2025-03-13 13:14:20
オリジナル
586 人が閲覧しました

PL/SQLの例外を処理します

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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート