2013-03-28 24 views
10

Tôi đang chèn nhiều bản ghi bằng cách sử dụng chèn hàng loạt JDBC. Có cách nào để lấy khóa được tạo cho mỗi bản ghi không? Tôi có thể sử dụng ps.getGeneratedKeys() với chèn hàng loạt không?Làm thế nào để có được các khóa được tạo từ chèn hàng loạt JDBC trong Oracle?

Tôi đang sử dụng oracle.jdbc.OracleDriver

final String insert = "Insert into Student(RollNumber, Name, Age) values(StudentSEQ.nextval, ? , ?)"; 
final int BATCH_SIZE = 998; 
int count = 0; 
Connection con = null; 
PreparedStatement ps = null; 
try { 
    con = getConnection(); 
    ps = con.prepareStatement(insert); 
    for (Student s : students) { 
     ps.setString(1, s.getName()); 
     ps.setInt(2, s.getAge()); 
     ps.addBatch(); 
     count++; 
     if (count % BATCH_SIZE == 0) { 
     // Insert records in batches 
      ps.executeBatch(); 
     } 
    } 
    // Insert remaining records 
    ps.executeBatch(); 
} finally { 
    if(ps != null) 
     ps.close(); 
    release(con); 
} 

Tôi đang nghĩ đến việc sử dụng ps.executeUpdate() cùng với ps.getGeneratedKeys() bên trong vòng lặp để có được kết quả mong muốn. Bất kỳ giải pháp nào khác?

+1

Bạn có sử dụng chuỗi trong chèn hàng loạt không? – Rachcha

+0

Có, StudentSEQ là trình tự cho bảng. – atripathi

Trả lời

6

Các JDBC 4.1 specification, phần 13,6 lấy Auto tạo giá trị nói:

Đó là thực hiện xác định là liệu getGeneratedKeys sẽ trở lại giá trị tạo ra sau khi gọi phương thức executeBatch.

Vì vậy, bạn sẽ cần phải kiểm tra xem trình điều khiển của bạn có thực sự hỗ trợ nó cho cập nhật hàng loạt hay không. Như đã nêu trong the answer by Philip O., thu hồi các phím tạo ra không được hỗ trợ với bản cập nhật hàng loạt như tài liệu trong Oracle 12 JDBC Standards Support:

Bạn không thể kết hợp các phím tự động được tạo ra với bản cập nhật hàng loạt.

Trong mọi trường hợp nếu nó được hỗ trợ bởi trình điều khiển của bạn hơn tuyên bố của bạn chuẩn bị nên được thay đổi vào mã dưới đây để hướng dẫn người lái xe để lấy chìa khóa tạo:

ps = con.prepareStatement(insert, Statement.RETURN_GENERATED_KEYS); 

Lưu ý: bạn có thể cần phải sử dụng một trong các phương thức chuẩn tạo khóa khác (prepareStatement(sql, columnIndexes) hoặc prepareStatement(sql, columnNames)) vì Oracle sẽ trả về ROW_ID bằng phương pháp trong ví dụ của tôi.