Data インターフェースでは、updateMany() メソッドは、ステートメントが複数回実行されることを示します。
コードで単一の DML ステートメントを繰り返し実行し、同じ SQL ステートメントがある update() メソッドを呼び出し、各回異なるパラメーターを渡すことも可能ですが、通常は updateMany() メソッドを使用するほうがより効率的です。
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) を使用します。