異機種のバッチ更新の例外処理

異機種のバッチ更新の実行中にエラーが発生すると、com.ibm.pdq.runtime.exception.UpdateManyException がスローされます。 例外に関する情報や、例外を生成する SQL ステートメントに関する情報を取得できます。 com.ibm.pdq.runtime.exception.HeteroBatchSQLException には SQL エラー情報が含まれます。

UpdateManyException.getUpdateCounts() メソッドを呼び出すことによって、異機種バッチ更新の更新カウントが含まれる 2 次元 int 配列を取得できます。 この配列には、バッチが正常に完了した場合に戻される更新カウントが含まれます。

配列内の値は、更新カウントか Java™ EXECUTE_FAILED になります。 配列内の情報を使用して、エラーの発生場所を見つけることができます。

以下の方法で例外を取得できます。

以下の異機種のバッチの例は、6 つの更新を実行します。 バッチを実行すると、以下のようになります。
  1. updateMany() メソッドを使用したバッチ更新により、表 A に対して 3 回挿入が実行されます。
  2. 単一の UPDATE SQL ステートメントにより、表 F の 5 つの行が変更されます。
  3. 表 B に対する単一の INSERT SQL ステートメントは、既存の主キーを挿入しようとするために、SqlIntegrityConstraintViolationException で失敗します。
  4. 単一の DELETE SQL ステートメントにより、表 G から 5 つの行が削除されます。
  5. updateMany() メソッドを使用したバッチ更新により、表 H に対して 2 回挿入が実行されます。 どちらの挿入も既存の主キーを挿入しようとするため、SqlIntegrityConstraintViolationException で失敗します。
  6. 単一の INSERT SQL が表 I に対して行われます。
以下の UpdateManyException がスローされます。

com.ibm.pdq.runtime.exception.UpdateManyException: [pdq][10363][3.200.401] pureQuery® が異種 SQL ステートメントから成るバッチを実行しているときに、1 つ以上の例外が発生しました。

メソッド getHeterogeneousUpdateCounts () を呼び出し、更新カウントの 2 次元 int 配列を戻して、失敗した SQL ステートメントを判別します。 配列の内容を以下の表にリストします。

表 1. 異機種のバッチ更新のカウントを示した表
配列指標 カウント1
[0][0] 1
[0][1] 1
[0][2] 1
[1][0] 5
[2][0] EXECUTE_FAILED
[3][0] 5
[4][0] EXECUTE_FAILED
[4][1] EXECUTE_FAILED
[5][0] 1
注:
  1. EXECUTE_FAILED は JDBC 定義の定数 java.sql.Statement.EXECUTE_FAILED です。
以下のメソッドを使用して例外を取得できます。
  • UpdateManyException.getHeteroBatchSQLExceptionArray () は、行固有の HeteroBatchSQLException が含まれる配列を戻します。 1 つの行の例外が複数ある場合は、それらの例外は一緒にチェーニングされます。
  • UpdateManyException.getBatchNonSpecificExceptions() は、行固有でない HeteroBatchSQLException を戻します。

UpdateManyException.getHeteroBatchSQLExceptionArray() によって戻される配列を以下の表にリストします。

表 2. 行固有の HeteroBatchSQLException が含まれる配列
配列指標
[0][0] null
[0][1] null
[0][2] null
[1][0] null
[2][0] 以下の情報が含まれる HeteroBatchSQLException。

com.ibm.db2.jcc.am.SqlIntegrityConstraintViolationException: ステートメント #3 内のバッチ・エレメント #1 に関するエラー: INSERT ステートメント内または UPDATE ステートメント内、あるいは DELETE ステートメントによる外部キー更新内で、1 つ以上の値が無効です。これは、"1" によって識別される基本キー、ユニーク制約、またはユニーク索引の制約により、表 "DB2ADMIN.G" が索引キーの重複する値を持つことができないからです。

[3][0] null
[4][0] 以下の情報が含まれる HeteroBatchSQLException。

com.ibm.db2.jcc.am.SqlIntegrityConstraintViolationException: ステートメント #5 内のバッチ・エレメント #1 に関するエラー: INSERT ステートメント内または UPDATE ステートメント内、あるいは DELETE ステートメントによる外部キー更新内で、1 つ以上の値が無効です。これは、"1" によって識別される基本キー、ユニーク制約、またはユニーク索引の制約により、表 "DB2ADMIN.H" が索引キーの重複する値を持つことができないからです。

[4][1] 以下の情報が含まれる HeteroBatchSQLException。

com.ibm.db2.jcc.am.SqlIntegrityConstraintViolationException: ステートメント #5 内のバッチ・エレメント #2 に関するエラー: INSERT ステートメント内または UPDATE ステートメント内、あるいは DELETE ステートメントによる外部キー更新内で、1 つ以上の値が無効です。これは、"1" によって識別される基本キー、ユニーク制約、またはユニーク索引の制約により、表 "DB2ADMIN.H" が索引キーの重複する値を持つことができないからです。

[5][0] null

行固有でない SQLException がないので、UpdateManyException.getBatchNonSpecificExceptions() は null を戻します。

一緒にチェーニングされた HeteroBatchSQLException を取得するには、UpdateManyException.getCause() メソッドと UpdateManyException.getNextException() メソッドを呼び出します。 getCause() の呼び出しと getNextException() の呼び出しによって戻される HeteroBatchSQLException を以下にリストします。

  1. getCause() 呼び出しは、以下の原因を戻します。

    com.ibm.db2.jcc.am.BatchUpdateException: [jcc][102][10040][3.63.46] バッチが失敗しました。 バッチは実行依頼されましたが、バッチの個別メンバーのいずれかで 1 つ以上の例外が発生しました。 getNextException() を使用して、バッチ処理された特定のエレメントの例外を取得してください。

  2. 最初の getNextException() 呼び出しは、以下の情報が含まれる HeteroBatchSQLException を戻します。

    com.ibm.db2.jcc.am.SqlIntegrityConstraintViolationException: ステートメント #3 内のバッチ・エレメント #1 に関するエラー: INSERT ステートメント内または UPDATE ステートメント内、あるいは DELETE ステートメントによる外部キー更新内で、1 つ以上の値が無効です。これは、"1" によって識別される基本キー、ユニーク制約、またはユニーク索引の制約により、表 "DB2ADMIN.G" が索引キーの重複する値を持つことができないからです。

  3. 2 つ目の getNextException() 呼び出しは、以下の情報が含まれる HeteroBatchSQLException を戻します。

    com.ibm.db2.jcc.am.SqlIntegrityConstraintViolationException: ステートメント #5 内のバッチ・エレメント #1 に関するエラー: INSERT ステートメント内または UPDATE ステートメント内、あるいは DELETE ステートメントによる外部キー更新内で、1 つ以上の値が無効です。これは、"1" によって識別される基本キー、ユニーク制約、またはユニーク索引の制約により、表 "DB2ADMIN.H" が索引キーの重複する値を持つことができないからです。

  4. 3 つ目の getNextException() 呼び出しは、以下の情報が含まれる HeteroBatchSQLException を戻します。

    com.ibm.db2.jcc.am.SqlIntegrityConstraintViolationException: ステートメント #5 内のバッチ・エレメント #2 に関するエラー: INSERT ステートメント内または UPDATE ステートメント内、あるいは DELETE ステートメントによる外部キー更新内で、1 つ以上の値が無効です。これは、"1" によって識別される基本キー、ユニーク制約、またはユニーク索引の制約により、表 "DB2ADMIN.H" が索引キーの重複する値を持つことができないからです。

  5. 4 つ目の getNextException() 呼び出しは、以下の情報を戻します。

    null


Feedback