さて、以前は少し複雑すぎたので、この質問を言い換えます。
私はこれを取りたい:
con.setAutoCommit(false);
String tempforbatch;
Statement stmt = con.createStatement();
for (int i = 0; i < tables.length; i++) {
tempforbatch = "INSERT INTO " + tables[i] + " VALUES ('" + values[i] + "')";
stmt.addBatch(tempforbatch);
}
stmt.executeBatch();
以下を使用するだけで、まったく同じものに変換できます。
PreparedStatement stmt = con.prepareStatement("INSERT INTO table_name VALUES (?, ?)");
ここで、「table_name」は、ループを通過するたびにどのtables[i]であるかに基づいて置き換えることができます。
私はこれまで考えられるあらゆる方法を試しましたが、SQLに対して無効であるか、毎回最後のINSERTを除くすべてが欠落しているだけで、すべて同じ結果になります。
結局、私はすべての挿入物、おそらく100、おそらく1000をバッチ処理するループを作りたいと思っています。いずれにせよ、すべての挿入をループしてバッチ処理し、すべてが完了したらバッチを実行する必要があります。もう1つの方法は、すべての挿入を単独で実行することです。これにより、そもそもバッチ関数を使用する理由がなくなります。
これを行う方法があった場合のみ:
PreparedStatement stmt = con.prepareStatement("INSERT INTO ? VALUES (?, ?)");
...loop code here....
stmt.setTable(1, "table1");
stmt.setString(2, "value1");
stmt.setString(3, "value2");
stmt.addBatch();
...end loop here....
stmt.executeBatch();
ただし、誰もが知っているように、.setTableは存在しません:(存在する場合は、ループに配置し、ループを通過するたびに異なるテーブル値を指定できます。このタイプのループは、すべてが同じテーブル。