2016-05-25 1 views
1

Я использую библиотеку java.sql для выполнения обновлений пакетами. Когда выполнено executeStatement.executeBatch(), в идеале он должен возвращать массив подсчетов обновлений.Состояние терминала для JDBC подготовленоStatement.executeBatch()

Но в некоторых случаях, вместо обновления считает он возвращает -2, как показано ниже ..

/** 
* The constant indicating that a batch statement executed successfully 
* but that no count of the number of rows it affected is available. 
* 
* @since 1.4 
*/ 
int SUCCESS_NO_INFO = -2; 

Таким образом, в этом случае, когда я бегу запросов в пакетах, нет никакого способа узнать, является ли конкретное выполнение пакетного запроса обновляло любые записи или нет. Таким образом, нет возможности определить условие терминала для выхода из цикла пакетного выполнения. Если у кого-то есть обходное решение или предложение. Было бы полезно.

У меня есть условие ниже прямо сейчас.

private static String batchUpdate() throws SQLException { 

    Connection dbConnection = null; 
    PreparedStatement preparedStatement = null; 
    String result = null; 

    String updateSQL = "update TABLE_NAME set SOME_FLAG ='T' \n" + 
      " where SOME_USER!='SOMEUSER' and SOME_FLAG = 'F' and rownum<=?"; 

    try { 
     dbConnection = getDBConnection(); 
     preparedStatement = dbConnection.prepareStatement(updateSQL); 

     dbConnection.setAutoCommit(false); 

     while (true) { 
      preparedStatement.setInt(1, 10000); 
      preparedStatement.addBatch(); 
      int[] updateResults = preparedStatement.executeBatch(); 
      if (updateResults == null || updateResults.length == 0 || updateResults[0] == -3) { 
       break; 
      } 
      dbConnection.commit(); 
     } 

     result = "Records are updated!"; 
    } catch (SQLException e) { 
     result = e.getMessage(); 
     dbConnection.rollback(); 
    } finally { 
     if (preparedStatement != null) { 
      preparedStatement.close(); 
     } 
     if (dbConnection != null) { 
      dbConnection.close(); 
     } 
    } 
    return result; 
} 
+0

Собственно, можете ли вы разместить больше своего кода? Я не думаю, что вы должны хранить результаты в массиве. –

+0

@AlvinBunk Добавлен весь метод – Vij

+1

Я не понимаю, почему вы используете 'executeBatch()' вообще, если в пакете есть только одно обновление. Я также не вижу точки цикла. – EJP

ответ

-2

Я посмотрел на некоторые примеры here, и я думаю, что вы должны будете поймать исключение в коде.

Таким образом, это означает полную редизайн вашего кода. Посмотрите ссылку на учебник. Я думаю, это не должно быть так тяжело для вас.

Также сделайте откат, если получите исключение!

+0

Кто сделал downvotes? –

+0

Спасибо за предложение, но оно не будет генерировать исключение, если нет записей для обновления. примечание стороны: я не спускал вниз. – Vij