programing

영향을 받는 Oracle JDBC batchUpdate 행은 항상 -2(문)입니다.SUCCESS_NO_INFO)

skycolor 2023. 10. 9. 22:25
반응형

영향을 받는 Oracle JDBC batchUpdate 행은 항상 -2(문)입니다.SUCCESS_NO_INFO)

Bulk UPDATE statement를 수행하는 batch process가 있습니다.

Spring JDBC 4.1.6 및 Oracle Jdbc Driver(ojdbc7 및 ucp)를 사용하여 배치 지원을 구현한 후 개별 업데이트 요청(배치 내)에 영향을 받는 레코드 수는 항상 -2(Statement)로 검색됩니다.SUCCESS_NO_INFO).

이 후 INSERT 문으로 동일한 인수를 다시 시도해야 하는데 개별 업데이트 요청(인수가 일괄 설정됨)에 영향을 받는 행을 알 수 있는 방법이 있습니까?

기술적으로 UPSERT 구현으로 개발하려고 합니다.

저는 이 일괄 업데이트를 3가지 다른 방법으로 시도했는데, 세 가지 방법 모두 결과가 같습니다. (Statement만 알려줍니다.SUCCESS_NO_INFO(-2)

방법 1 -- 직접 UCP 연결 및 준비문

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

방법 2 - Spring JdbcTemplate 및 batchUpdate()

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

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

방법 3 - Spring BatchSqlUpdate 구현

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

12.1부터 오라클 데이터베이스는 배치의 각 요소에 대해 업데이트된 행 수를 반환합니다.12.1 데이터베이스 및 드라이버(12.1.0.2)가 필요합니다.이전 버전의 데이터베이스에는 이 기능이 없습니다.

12.1부터 시작합니다.

int updatedRows[] = pstmt.executeBatch();

실제로 배치의 각 요소에 대해 업데이트된 행의 수를 포함하는 배열을 -2 대신 반환합니다. 그런데 이 기능은 JDBC 씬 드라이버에만 있습니다.

언급URL : https://stackoverflow.com/questions/29296592/oracle-jdbc-batchupdate-rows-affected-is-always-2-statement-success-no-info

반응형