外部データベースにアクセス中にエラーが生じた場合には、次の 2 つのオプションのいずれかを行うことができます。
最初のオプションはデフォルトです。現行ノードでの ESQL 処理を中止します。その場合、エンクロージング・キャッチ・ノードまたはメッセージ・フローの入力ノードに到達するまで、例外がメッセージ・フローの逆方向に伝搬します。例外が入力ノードに到達すると、トランザクションはロールバックされます。
2 番目のオプションは、データベース戻りコード、およびエラーが生じた場合に取られるアクションの論理推移についての知識を必要とします。このインライン・データベース・エラー処理を使用可能にするためには、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 ノードを組み込むこともできます。
Airline Reservations sample サンプル・プログラムは、これらのデータベース関数を使用する ESQL のその他の例です。