Data 인터페이스에서 updateMany() 메소드는 명령문이 여러 번 실행됨을 표시합니다.
코드가 단일 DML문을 반복적으로 실행하여 동일한 SQL문을 포함한 update() 메소드를 호출하고 매번 다른 매개변수를 전달할 수 있어도 일반적으로 updateMany() 메소드를 사용하는 것이 더 효율적입니다.
INSERT INTO HR.EMPLOYEE VALUES(:id, :lastName, :firstName, :dept, :location);Employee라고 하는 Bean 또는 Map 오브젝트를 사용하여 SQL문에 값을 전달합니다. updateMany() 메소드를 사용하여 동일한 SQL문을 전달할 수 있습니다. 그러나 동일한 유형의 반복 가능 오브젝트를 Bean 또는 Map 오브젝트로 사용하여 값을 전달합니다.
리턴된 int 배열은 SQL문의 각각의 실행에 대한 성공(및 연관 갱신 계수) 또는 실패를 JDBC로 표시합니다. 여기에는 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 테이블에 있는 회사 B의 직원을 포함해야 한다고 가정하십시오. 회사 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)