Data インターフェースの updateMany() メソッドによる単一データベース・オブジェクトに対するバッチ更新

Data インターフェースの updateMany() メソッドを使用して、データベース・オブジェクトの複数の更新を実行できます。

説明

Data インターフェースでは、updateMany() メソッドは、ステートメントが複数回実行されることを示します。

コードで単一の DML ステートメントを繰り返し実行し、同じ SQL ステートメントがある update() メソッドを呼び出し、各回異なるパラメーターを渡すことも可能ですが、通常は updateMany() メソッドを使用するほうがより効率的です。

updateMany() メソッドにより、繰り返すことができるデータのコレクション (つまりバッチ) を渡すことができます。 例えば、update() メソッドを使用すると、以下の SQL ステートメントを実行できます。
INSERT INTO HR.EMPLOYEE VALUES(:id, :lastName, :firstName, :dept, :location);
値を SQL ステートメントに、おそらく Employee などの名前の Bean、または Map オブジェクトを使用して渡します。 updateMany() メソッドを使用すると、同じ SQL ステートメントを使用できます。 ただし値は、Bean または Map オブジェクトと同じタイプの Iterable オブジェクトを使用して渡します。

戻される int 配列は、JDBC の場合のとおり、SQL ステートメントの各実行の成功 (および関連する更新カウント) または失敗を示します。 これには、JDBC の更新カウントの Statement.EXECUTE_FAILED および SUCCESS_NO_INFO の使用が含まれます。

失敗が起きる場合、com.ibm.pdq.runtime.exception.UpdateManyException 例外という結果になります。 この実行時例外には、JDBC がその java.sql.BatchUpdateException 例外で報告する情報が含まれます。

SQL CALL ステートメントのバッチを実行する場合には、ストアード・プロシージャーに OUT および INOUT パラメーターがなく、照会結果を戻さない場合にのみ、updateMany() メソッドを使用できます。

企業 A が企業 B を買収し、その従業員を表 HRDept.Employee に組み込む必要があるとします。 企業 A がこの表を表すために使用するクラスは、以下のように定義されます。

public EmplData {
  public String empId;
  public String firstName;
  public String middleName;
  public String lastName;
  public String deptId;
  public BigDecimal baseSalary;
  public BigDecimal bonus;
  public String extension;
  public Date hireDate;
  public String status;
}

企業 B の従業員記録の書式が、企業 A によって使用されていたものと一致する可能性はまずありません。一致するとすれば、EMPNO および WORKDEPT 列の値は競合する可能性があります。 そのため、企業 B の記録に対する処理が必要です。

この例では、その処理は java.util.ArrayList<T> で実行されると想定されます。ここで com.companyb.EmplData は、従業員用に企業 B の人事部門で使用しているクラスであるため、汎用 <T> です。

企業 B のすべての従業員に新規従業員 ID が割り当てられ、その部門情報が企業 A の部門 ID を反映するように更新された後に、HRDept.Employee 表を更新する変更は、以下のようなアプリケーション・ロジックで加えることができます。

ArrayList<EmplData> transferHires = new ArrayList<EmplData>();

EmplData transferHire1 = new EmplData (...);
EmplData transferHire2 = new EmplData (...);
EmplData transferHire3 = new EmplData (...);

transferHires.add (transferHire1);
transferHires.add (transferHire2);
transferHires.add (transferHire3);

Connection con = DriverManager.getConnection(...);
Data db = DataFactory.getData(con);

int[] manyCount = db.updateMany(
 "INSERT INTO HRDept.Employee(EMPNO, FIRSTNME," +       
 " MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE) " +
 "VALUES(:empId, :firstName, SUBSTR(:middleName,1,1), " +   
 ":lastName, :deptId, :extension, :hireDate)", transferHires );

この例では、updateMany() メソッドの定義 public <T> int[] updateMany(java.lang.String sql, Iterable<T> parameters) を使用します。


フィードバック