簡體   English   中英

Java JDBC - 多個預准備語句批量插入

[英]Java JDBC - Multiple prepared statement bulk insert

使用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();

但是這種方法只能使用一個准備好的語句,因此只能使用一個插入。 我該如何為這個問題提供解決方案?

你可以試試

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();
}
...

如果我正確理解您的問題,那么NEXTVAL和CURRVAL會出現問題,因為CURRVAL可能因其他數據庫使用而發生變化? 如果是這樣,您可以將代碼更改為此訂單:

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

我是否正確理解了您的問題?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM