BatchUpdateException からの情報の取り出し

バッチに含まれている 1 つのステートメントの実行中にエラーが発生しても、処理は続行します。 ただし、executeBatch から BatchUpdateException がスローされます。

プロシージャー

BatchUpdateException から情報を取り出すには、以下の手順を実行します。

  1. BatchUpdateException.getUpdateCounts メソッドを使用して、例外がスローされる前にバッチ内の各 SQL 文が更新した行数を決定します。
    getUpdateCount からは、バッチに含まれている各ステートメントに対応するエレメントが配列として返されます。 各エレメントには、以下のいずれかの値が入ります。
    n
    ステートメントによって更新された行の数。
    Statement.SUCCESS_NO_INFO
    この値は、更新された行の数を確認できない場合に返されます。 以下の条件が真の場合には、更新された行数は判別できません。
    • アプリケーションは、 Db2 for z/OS® バージョン8の新機能モード、またはそれ以降です。
    • アプリケーションは、 3.1 以降のバージョンを使用しています。 IBM® Data Server Driver for JDBC and SQLJ
    • これは、 IBM Data Server Driver for JDBC and SQLJ 複数行のINSERT操作を使用して、バッチ更新を実行します。
    Statement.EXECUTE_FAILED
    この値は、ステートメントが正常に実行されなかった場合に返されます。
  2. バッチ・ステートメントから自動生成キーを返す可能性があるなら、
    1. BatchUpdateExceptioncom.ibm.db2.jcc.DBBatchUpdateException にキャストします。
    2. DBBatchUpdateException.getDBGeneratedKeys メソッドを呼び出して、バッチ処理されたSQL文の各実行に対して自動生成されたキーを含む ResultSet オブジェクトの配列を取得します。
    3. 配列内の各 ResultSet がnullであるかどうかをテストします。
      ResultSet の内容は以下のとおりです。
      • ResultSet がヌルでない場合、そこには、バッチ SQL ステートメントの実行の自動生成キーが含まれています。
      • ResultSet がヌルの場合、バッチ・ステートメントの実行は失敗します。
  3. SQLException メソッド getMessagegetSQLStategetErrorCode を使用して、最初のエラーの説明、SQLSTATE、エラーコードを取得します。
  4. BatchUpdateException.getNextException メソッドを使用して、連結された SQLException を取得します。
  5. ループ内で、 getMessagegetSQLStategetErrorCodegetNextException のメソッドコールを実行して、 SQLException に関する情報を取得し、次の SQLException を取得します。

自動生成キーを返すバッチ・ステートメントについて、BatchUpdateException の各フィールドと、連鎖的につながっている SQLException オブジェクトを取得するコード断片を以下に示します。 この例では、自動生成キーには 1 つしか列が含まれていないこと、およびデータ・タイプが数値であるキー値が必ず 1 つあるということを想定しています。 選択されたステートメントの右にある番号は、前述のステップに対応しています。
try {
  // Batch updates
} catch(BatchUpdateException buex) {
    System.err.println("Contents of BatchUpdateException:");
    System.err.println(" Update counts: ");
    int [] updateCounts = buex.getUpdateCounts();             1 
    for (int i = 0; i < updateCounts.length; i++) {
      System.err.println("  Statement " + i + ":" + updateCounts[i]);
    }
    ResultSet[] resultList = 
      ((DBBatchUpdateException)buex).getDBGeneratedKeys();    2 
    for (i = 0; i < resultList.length; i++)
    {
      if (resultList[i] == null)
         continue; // Skip the ResultSet for which there was a failure
      else {
        rs.next();
        java.math.BigDecimal idColVar = rs.getBigDecimal(1);     
                                      // Get automatically generated key 
                                      // value
        System.out.println("Automatically generated key value = " + idColVar);
      }
    }
    System.err.println(" Message: " + buex.getMessage());     3 
    System.err.println(" SQLSTATE: " + buex.getSQLState());
    System.err.println(" Error code: " + buex.getErrorCode());
    SQLException ex = buex.getNextException();                4 
    while (ex != null) {                                      5 
      System.err.println("SQL exception:");
      System.err.println(" Message: " + ex.getMessage());
      System.err.println(" SQLSTATE: " + ex.getSQLState());
      System.err.println(" Error code: " + ex.getErrorCode());
      ex = ex.getNextException();
    }
}