デフォルトでは、SPLプログラムで発生したエラーはプログラムの実行を中止します。 EXCEPTIONセクションを持つBEGINブロックを使用すると、エラーをトラップして回復できます。
対応する構文は、BEGINブロックの通常の構文の拡張です。
[ DECLARE]
declarations ]
BEGIN
statements
EXCEPTION
条件 [OR条件]... THEN
handler_statements
[WHEN condition [ OR condition ]... THEN
handler_statements ]...
エンド; エラーが発生しない場合、この形式のブロックは単にすべてのステートメントを実行し、制御はENDの後の次のステートメントに渡されます。 ステートメント内でエラーが発生した場合、ステートメントのさらなる処理は中止され、制御はEXCEPTIONリストに渡されます。 発生したエラーに一致する第1の条件を求めてリストを検索する。 一致が見つかった場合、対応するhandler_statementsが実行され、制御はENDの後の次のステートメントに移る。 一致しない場合は、EXCEPTION句が存在しないかのようにエラーが伝播します。 このエラーは、EXCEPTIONを使用して囲むブロックでキャッチできます。 囲みブロックが存在しない場合、エラーはサブプログラムの処理を中止する。
特殊条件名OTHERSは、すべてのエラータイプに一致します。 条件名は大文字と小文字を区別しません。
選択したhandler_statements内で新しいエラーが発生した場合、このEXCEPTION句でエラーを検出することはできませんが、エラーは伝播されます。 周囲のEXCEPTION句はエラーをキャッチできます。
次の表に、使用できる条件名を示します。
| 条件名 | 説明 |
| CASE_NOT_FOUND | アプリケーションは、CASEステートメントのいずれのケースもTRUEと評価されず、ELSE条件が存在しない状況に遭遇しました。 |
| COLLECTION_IS_NULL | アプリケーションは、初期化されていないネストされたテーブルなどのnullコレクションでコレクションメソッドを起動しようとしました。 |
| CURSOR_ALREADY_OPEN | アプリケーションは、既に開いているカーソルを開こうとしました。 |
| DUP_VAL_ON_INDEX | アプリケーションは、制限された列内に現在存在する重複値を格納しようとしました。 |
| INVALID_CURSOR | アプリケーションは未開封のカーソルにアクセスしようとしました。 |
| INVALID_NUMBER | アプリケーションでデータ例外が発生しました (SQLSTATEクラスコード22に相当) 。 INVALID_NUMBERはVALUE_ERRORのエイリアスです。 |
| NO_DATA_FOUND | 選択基準を満たす行はありません。 |
| その他 | アプリケーションは、例外セクションの前の条件によってキャッチされていない例外に遭遇しました。 |
| SUBSCRIPT_BEYOND_COUNT | アプリケーションは、初期化サイズまたは拡張サイズを超えて、ネストされたテーブルまたはvarrayの下付き文字を参照しようとしました。 |
| SUBSCRIPT_OUTSIDE_LIMIT | アプリケーションは、添え字を参照するか、最大サイズ制限を超えてvarrayを拡張しようとしました。 |
| TOO_MANY_ROWS | アプリケーションでは、選択基準を満たす複数の行が発生しています (1つの行のみを返すことができます) 。 |
| VALUE_ERROR | アプリケーションでデータ例外が発生しました (SQLSTATEクラスコード22に相当) 。 VALUE_ERRORはINVALID_NUMBERのエイリアスです。 |
| ZERO_DIVIDE | アプリケーションはゼロで除算しようとしました。 |
| ユーザー定義の例外 | 詳細については、「ユーザー定義の例外」をご参照ください。 |
説明 条件名INVALID_NUMBERおよびVALUE_ERRORは、Oracleデータベースと互換性がありません。 Oracleデータベースの場合、これらの条件名は、文字列の数値リテラルへの変換が失敗した場合にのみ発生する例外用です。 さらに、Oracleデータベースの場合、INVALID_NUMBER例外はSQL文にのみ適用され、VALUE_ERROR例外は手続き文にのみ適用されます。