JDBC preparedStatement.executeBatch()的终端条件

时间:2016-05-25 23:34:32

标签: java oracle jdbc batch-processing

我正在使用java.sql库批量执行更新。 执行preparedStatement.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;
}

2 个答案:

答案 0 :(得分:1)

Oracle 11g does not return update counts用于批处理方法。相反,它返回SUCCESS_NO_INFO。

答案 1 :(得分:-2)

我查看了一些示例http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_split_path_info,我认为您必须在代码中捕获异常。

所以这意味着完全重新设计代码。 查看教程链接。我认为对你来说不应该那么难。

另外,如果出现异常,请进行回滚!