EXCEPT処理は、多くのデータを処理するクエリで便利です。すべてのエラーにはSQLステート、エラーコード、およびその他の識別子が定義されているため、ログを確認し、どのようなエラーが発生したかを確認することができます(発生した場合)。
EXCEPTION句がcompound statement内で使用されている場合、ステートメントから発生する処理例外は、実行の流れがEXCEPTIONステートメントに移行することでキャッチされます。このブロックによって開始されたブロックレベルのトランザクションは、例外ハンドラが正常に完了した場合にコミットされます。例外ハンドラから別の例外や元の例外が発生すると、トランザクションはロールバックします。
心に留めておくべき重要なことが2つあります:
BLOCKに固有の一時テーブルや変数は、例外ハンドラ文では使用できません;- 通常、ソースに起因するエラーや関数の実行時に発生する処理例外のみが捕捉されます。低レベルの内部エラー または Java RuntimeException は捕捉されません。
捕捉された例外の処理を支援するために、EXCEPTION句は、例外の重要なフィールドを公開するグループ名を指定します。例外グループには以下のものが含まれます:
Variable | Type | Description |
|---|---|---|
| string | SQL State |
| integer | Error or vendor code. In the case of an internal exception, this will be the integer suffix of the |
| string | Full event code. Typically |
| object | Exception being caught. |
| object | Chained exception or cause of the current exception |
例外グループ名は、上位の例外グループ名やループカーソル名と同じであってはなりません。
Example of Exception Group Handling
BEGIN DECLARE EXCEPTION e = SQLEXCEPTION 'this is bad' SQLSTATE 'xxxxx'; RAISE variables.e;EXCEPTION e IF (e.state = 'xxxxx') -- in this trivial example, we'll always hit this branch and just log the exception RAISE SQLWARNING e.exception; ELSE RAISE e.exception;END