2015-03-27 11 views
7

Tôi có một quy trình xử lý hàng loạt thực hiện lệnh UPDATE Bulk.Oracle JDBC batchUpdate hàng bị ảnh hưởng luôn là -2 (Statement.SUCCESS_NO_INFO)

Sau khi triển khai hỗ trợ lô bằng cách sử dụng Spring JDBC 4.1.6 và Oracle Jdbc Driver (ojdbc7 và ucp), số lượng bản ghi bị ảnh hưởng cho các yêu cầu cập nhật riêng lẻ (trong lô) luôn được truy xuất dưới dạng -2 (Statement.SUCCESS_NO_INFO).

Có cách nào để biết các hàng bị ảnh hưởng cho các yêu cầu cập nhật riêng lẻ (đối số được đặt theo lô), vì tôi phải thử lại cùng một đối số với câu lệnh INSERT sau này không ??

Về mặt kỹ thuật cố gắng phát triển này như một thực hiện UPSERT

tôi đã cố gắng cập nhật đợt này theo ba cách khác nhau, và trong tất cả ba phương pháp kết quả là giống nhau - (Nó chỉ nói với tôi Statement.SUCCESS_NO_INFO (-2))

Phương pháp 1 - Kết nối UCP Direct và PreparedStatement

connectionPoolMgr.startConnectionPool("mgr_pool"); 
    Connection connection = pds.getConnection(); 

    PreparedStatement pstmt = connection.prepareStatement(dmlSQL); 
    pstmt.setInt(1, pkId); 
    pstmt.setInt(2, idx * 10); 
    pstmt.addBatch(); 

    // EVERY ELEMENT IN THIS ARRAY IS ALWAYS returned as -2 
    int updatedRows[] = pstmt.executeBatch(); 

Phương pháp 2 - Spring JdbcTemplate và batchUpdate()

MapSqlParameterSource[] paramsArray = getSqlParameterList().toArray(new MapSqlParameterSource[0]); 

     // EVERY ELEMENT IN THIS ARRAY IS ALWAYS returned as -2 
int[] batchUpdateResult = getNamedParameterJdbcTemplate().batchUpdate(sqlStatement, paramsArray); 

Phương pháp 3 - Xuân BatchSqlUpdate thực hiện

BatchInsert batchInsert = new BatchInsert(dataSource); 
    for (int i = 0; i < count; i++) { 
     MapSqlParameterSource param = new MapSqlParameterSource(); 
     param.addValue("ID", i + 100); 
     param.addValue("FIRST_NAME", "Name" + i); 

     batchInsert.updateByNamedParam(param.getValues()); 
    } 

    batchInsert.flush(); 
    int rowsAffected[] = batchInsert.getRowsAffected(); 

    class BatchInsert extends BatchSqlUpdate { 
      private static final String SQL = "UPDATE t_customer_test SET first_name = :FIRST_NAME) WHERE id = :ID"; 

      BatchInsert(DataSource dataSource) { 
       super(dataSource, SQL); 
       declareParameter(new SqlParameter(Types.VARCHAR)); 
       declareParameter(new SqlParameter(Types.INTEGER)); 
       setBatchSize(100); 
       compile(); 
     } 
    } 
+0

Đã hỏi cùng một câu hỏi trên mạng OTN và nhận được một số câu trả lời hữu ích. Hiện tại tôi đang cố gắng thực hiện điều này như UPSERT bằng cách sử dụng MERGE Statement. Liên kết: https://community.oracle.com/message/12980203 –

Trả lời

6

Bắt đầu từ 12.1, cơ sở dữ liệu Oracle trả về số lượng hàng được cập nhật cho mỗi phần tử của hàng loạt. Bạn sẽ cần một cơ sở dữ liệu và trình điều khiển 12.1 (12.1.0.2). Tính năng này không tồn tại trong các phiên bản trước của Cơ sở dữ liệu.

Vì vậy, bắt đầu từ năm 12.1:

int updatedRows[] = pstmt.executeBatch(); 

thực sự sẽ trả về một mảng chứa số hàng được cập nhật cho mỗi phần tử trong hàng loạt thay vì -2. BTW tính năng này chỉ có trong trình điều khiển mỏng JDBC.

Các vấn đề liên quan