ブローカーが外部データベースにアクセスしたときにエラーが発生する場合は、ノードの処理時にブローカーから例外をスローするように設定することも、ESQL ステートメントを使用してノード自身の中で例外を処理することも可能です。
ノードの処理時にブローカーから例外をスローするという動作がデフォルトです。現在のノードでの ESQL 処理は中止されます。その場合、エンクロージング・キャッチ・ノードまたはメッセージ・フローの入力ノードに到達するまで、例外がメッセージ・フローの逆方向に伝搬します。例外が入力ノードに到達すると、トランザクションはロールバックされます。
ESQL ステートメントを使用してノード自身の中で例外を処理するには、データベースの戻りコードと、エラー発生時に実行する操作の論理的な流れを理解しておく必要があります。このインライン・データベース・エラー処理を使用可能にするためには、Filter、Database、または Compute ノードの「データベース・エラーの際に例外をスローする」プロパティーをクリアしなければなりません。 このプロパティーをクリアすると、ノードは例外をスローする代わりに、データベース・マネージャーからデータベース状態標識 (SQLCODE、SQLSTATE、SQLNATIVEERROR、および SQLERRORTEXT) に適切な情報を入れます。
「警告をエラーとして処理」プロパティーを選択しない限りは、 標識に情報が入るのは、エラー (または警告) が生じたときだけです。データベース操作が正常に行われ、情報にアクセスできる場合には、標識にはデフォルトの成功値が入ります。
これらの標識に含まれる値を ESQL ステートメントで使用して、取るべきアクションについて決定することができます。これらの標識には、SQLCODE、SQLSTATE、SQLNATIVEERROR、および SQLERRORTEXT 関数を使用してアクセスできます。
インライン・エラー処理を試行している場合、それぞれのデータベース・ステートメントが実行された後で状態標識を調べ、すべてのエラーをキャッチしてアクセスします。標識の処理時に、インラインで処理できないエラーを検出した場合は、新しい例外を生成し、その例外をキャッチ・ノードのアップストリームで処理するか、入力ノードに送ってトランザクションをロールバックできます。そのために使用できるのが ESQL THROW ステートメントです。
SELECT がデータを全く戻さないという特殊なケースをチェックしたい場合もあります。この状態はエラーとは見なされず、SQLCODE も設定されないので、明示的にテストを実行する必要があります。SELECT への戻り値の検査 を参照してください。
以下の ESQL 例では、これら 4 つのデータベース状態関数の使用方法および例外で戻されるエラー情報を組み込む方法を示します。
DECLARE SQLState1 CHARACTER; DECLARE SQLErrorText1 CHARACTER; DECLARE SQLCode1 INTEGER; DECLARE SQLNativeError1 INTEGER; -- 存在しない表へのデータベース挿入を行う -- INSERT INTO Database.DB2ADMIN.NONEXISTENTTABLE (KEY,QMGR,QNAME) VALUES (45,'REG356','my TESTING 2'); -- データベース戻りコードを取得する -- SET SQLState1 = SQLSTATE; SET SQLCode1 = SQLCODE; SET SQLErrorText1 = SQLERRORTEXT; SET SQLNativeError1 = SQLNATIVEERROR; -- THROW ステートメントを使用して、データベースをバックアウトし、ユーザー例外を送出する -- THROW USER EXCEPTION MESSAGE 2950 VALUES ( 'The SQL State' , SQLState1 , SQLCode1 , SQLNativeError1 , SQLErrorText1 );
データベース・エラーが検出された場合、例外をスローする必要はありません。LocalEnvironment ツリーに戻されるエラー情報を保管し、保管された値に基づいて、エラー・サブフローまたは成功サブフローへとメッセージを導くように、メッセージ・フローに Filter ノードを組み込むこともできます。