EXCEPT処理は、多くのデータを処理するクエリで便利です。すべてのエラーにはSQLステート、エラーコード、およびその他の識別子が定義されているため、ログを確認し、どのようなエラーが発生したかを確認することができます(発生した場合)。

EXCEPTION句がcompound statement内で使用されている場合、ステートメントから発生する処理例外は、実行の流れがEXCEPTIONステートメントに移行することでキャッチされます。このブロックによって開始されたブロックレベルのトランザクションは、例外ハンドラが正常に完了した場合にコミットされます。例外ハンドラから別の例外や元の例外が発生すると、トランザクションはロールバックします。 

心に留めておくべき重要なことが2つあります:

  • BLOCKに固有の一時テーブルや変数は、例外ハンドラ文では使用できません;
  • 通常、ソースに起因するエラーや関数の実行時に発生する処理例外のみが捕捉されます。低レベルの内部エラー または Java   RuntimeException  は捕捉されません。

捕捉された例外の処理を支援するために、EXCEPTION句は、例外の重要なフィールドを公開するグループ名を指定します。例外グループには以下のものが含まれます:

Variable

Type

Description

STATE

string

SQL State

ERRORCODE

integer

Error or vendor code. In the case of an internal exception, this will be the integer suffix of the TEIIDxxxx code

TEIIDCODE

string

Full event code. Typically TEIIDxxxx.

EXCEPTION

object

Exception being caught.

CHAIN

object

Chained exception or cause of the current exception


Only processed exceptions which are typically caused by errors originating at the sources or with function execution are caught. A low-level internal error or Java RuntimeException will not be caught.

例外グループ名は、上位の例外グループ名やループカーソル名と同じであってはなりません。

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