JDBC アプリケーションでのバッチ更新の作成
表の各行を 1 行ずつ更新する代わりにバッチ更新を使用すれば、JDBC によって一群の更新を同時に実行できます。 同じバッチ更新に組み込めるステートメントのことをバッチ可能 ステートメントといいます。
このタスクについて
入力パラメーターまたはホスト式が含まれているステートメントをバッチに組み込めるのは、そのバッチが同じステートメントの他のインスタンスだけで構成されている場合に限られます。 このタイプのバッチのことを同種バッチ といいます。 入力パラメーターのないステートメントをバッチに組み込めるのは、そのバッチに含まれている他のステートメントにも入力パラメーターやホスト式がない場合に限られます。 このタイプのバッチのことを異種バッチ といいます。 2 つのステートメントを同じバッチに組み込める場合、それらのステートメントはバッチ互換 であるといいます。
- addBatch
- executeBatch
- clearBatch
以下の PreparedStatement メソッドと CallableStatement メソッドを使用してパラメーターのバッチを作成すれば、1 つのステートメントをバッチの中で複数回実行し、各実行時に別々のパラメーター・セットを適用する、という操作を実行できます。
- addBatch
- バッチの中で SELECT ステートメントを実行しようとすると、BatchUpdateException がスローされます。
- バッチの中で実行する CallableStatement オブジェクトには、出力パラメーターを組み込めます。 ただし、出力パラメーターの値を取得することはできません。 そうしようとすると、BatchUpdateException がスローされます。
- バッチの中で実行する CallableStatement オブジェクトから ResultSet オブジェクトを取得することはできません。 BatchUpdateException はスローされませんが、getResultSet メソッド呼び出しでは NULL 値が返されます。
プロシージャー
バッチ更新を実行するには、以下に示す各ステップ群のうち、いずれか 1 つを実行します。
例
以下のコード断片では、2 つのパラメーター・セットをバッチの中に組み込みます。 1 つの UPDATE ステートメントを 2 つの入力パラメーター・セットのそれぞれに基づいて 2 回実行します。 選択されたステートメントの右にある番号は、前述のステップに対応しています。
try {
…
PreparedStatement preps = conn.prepareStatement(
"UPDATE DEPT SET MGRNO=? WHERE DEPTNO=?"); 2
ps.setString(1,mgrnum1); 3a
ps.setString(2,deptnum1);
ps.addBatch(); 3b
ps.setString(1,mgrnum2);
ps.setString(2,deptnum2);
ps.addBatch();
int [] numUpdates=ps.executeBatch(); 4
for (int i=0; i < numUpdates.length; i++) { 5a
if (numUpdates[i] == SUCCESS_NO_INFO)
System.out.println("Execution " + i +
": unknown number of rows updated");
else
System.out.println("Execution " + i +
"successful: " numUpdates[i] + " rows updated");
}
conn.commit(); 5b
} catch(BatchUpdateException b) { 6
// process BatchUpdateException
}
以下のコード断片では、バッチ INSERT ステートメントにより自動生成キーが返されます。
import java.sql.*;
import com.ibm.db2.jcc.*;
…
Connection conn;
…
try {
…
PreparedStatement ps = conn.prepareStatement( 2
"INSERT INTO DEPT (DEPTNO, DEPTNAME, ADMRDEPT) " +
"VALUES (?,?,?)",
Statement.RETURN_GENERATED_KEYS);
ps.setString(1,"X01"); 3a
ps.setString(2,"Finance");
ps.setString(3,"A00");
ps.addBatch(); 3b
ps.setString(1,"Y01");
ps.setString(2,"Accounting");
ps.setString(3,"A00");
ps.addBatch();
int [] numUpdates=preps.executeBatch(); 4
for (int i=0; i < numUpdates.length; i++) { 5a
if (numUpdates[i] == SUCCESS_NO_INFO)
System.out.println("Execution " + i +
": unknown number of rows updated");
else
System.out.println("Execution " + i +
"successful: " numUpdates[i] + " rows updated");
}
conn.commit(); 5b
ResultSet[] resultList =
((DB2PreparedStatement)ps).getDBGeneratedKeys(); 5c
if (resultList.length != 0) {
for (i = 0; i < resultList.length; i++) {
while (resultList[i].next()) {
java.math.BigDecimal idColVar = rs.getBigDecimal(1);
// Get automatically generated key
// value
System.out.println("Automatically generated key value = "
+ idColVar);
}
}
}
else {
System.out.println("Error retrieving automatically generated keys");
}
} catch(BatchUpdateException b) { 6
// process BatchUpdateException
}
以下のコード断片では、バッチ UPDATE ステートメントにより自動生成キーが返されます。 このコードでは、DEPTNO 列を自動生成キーとして指定し、バッチの中で DEPT 表中の 2 行を更新し、更新された行の DEPTNO の値を取り出します。 選択されたステートメントの右にある番号は、前述のステップに対応しています。
import java.sql.*;
import com.ibm.db2.jcc.*;
…
Connection conn;
…
String[] agkNames = {"DEPTNO"};
try {
…
conn.setAutoCommit(false); 1
PreparedStatement ps = conn.prepareStatement( 2
"UPDATE DEPT SET DEPTNAME=? " +
"WHERE DEPTNO=?",agkNames);
ps.setString(1,"X01"); 3a
ps.setString(2,"Planning");
ps.addBatch(); 3b
ps.setString(1,"Y01");
ps.setString(2,"Bookkeeping");
ps.addBatch();
int [] numUpdates=ps.executeBatch(); 4
for (int i=0; i < numUpdates.length; i++) { 5a
if (numUpdates[i] == SUCCESS_NO_INFO)
System.out.println("Execution " + i +
": unknown number of rows updated");
else
System.out.println("Execution " + i +
"successful: " numUpdates[i] + " rows updated");
}
conn.commit(); 5b
ResultSet[] resultList =
((DB2PreparedStatement)ps).getDBGeneratedKeys(); 5c
if (resultList.length != 0) {
for (i = 0; i < resultList.length; i++) {
while (resultList[i].next()) {
String deptNoKey = rs.getString(1);
// Get automatically generated key
// value
System.out.println("Automatically generated key value = "
+ deptNoKey);
}
}
}
else {
System.out.println("Error retrieving automatically generated keys");
}
}
catch(BatchUpdateException b) { 6
// process BatchUpdateException
}