Java JDBC - 多个预准备语句批量插入

时间:2011-08-25 18:52:32

标签: java jdbc prepared-statement

使用JDBC(Oracle)我需要在两个表的每一个中插入大约一千行。像这样:

"INSERT INTO TABLE_A (A_ID, A_NAME, A_LAST_NAME) VALUES (MY_SEQUENCE.NEXTVAL, ?, ?)";
"INSERT INTO TABLE_B (B_ID, B_DESCRIPTION) VALUES (MY_SEQUENCE.CURRVAL, ?)";

问题是两个表都是通过通用序列连接的,因此语句的顺序很重要。

如果我只有一张桌子那就很容易了。在那种情况下,我使用了代码:

String insert = "Insert into TABLE_A(A_ID, A_NAME, A_LAST_NAME) values(MY_SEQUENCE.NEXTVAL, ?, ?)";
conn.setAutoCommit(false);
PreparedStatement ps = conn.prepareStatement(insert);
for(MyObject obj : myCollection) {
    ps.setString(1, obj.getName());
    ps.setString(2, obj.getLastName());
    ps.addBatch();
}
ps.executeBatch();
conn.commit();
ps.close();

但是这种方法只能使用一个准备好的语句,因此只能使用一个插入。我该如何为这个问题提供解决方案?

2 个答案:

答案 0 :(得分:13)

你可以尝试

PreparedStatement ps = conn.prepareStatement(insert, Statement.RETURN_GENERATED_KEYS);
...
ps.executeBatch();

然后

ResultSet rs = ps.getGeneratedKeys();
ps = conn.prepareStatement("INSERT INTO TABLE_B (B_ID, B_DESCRIPTION) VALUES (?, ?)");

for ( int counter =0;rs.next(); counter++ ) { 
  ps.setInt(1,rs.getInt(0));
  ps.setString(2, myCollection.get(counter).getDescription());
  ps.addBatch();
}
...

答案 1 :(得分:1)

如果我正确理解您的问题,您会遇到NEXTVAL和CURRVAL的问题,因为CURRVAL可能因其他数据库使用而发生变化? 如果是这样,您可以将代码更改为此订单:

currentNextVal = select NEXTVAL
INSERT into table_a with currentNextVal as the id
INSERT into table_b with the same currentNextVal 

我是否正确理解了您的问题?