Как обновить несколько строк таблицы на основе одного значения? - PullRequest
1 голос
/ 30 ноября 2011

В моей таблице есть два столбца «res_allocation», один «ResName» и другой «PID», «ResName» будет иметь несколько значений для одного «PID».

Существует ли один запрос дляОбновление значений ResName в нескольких строках на основе PID?

Новые значения ResName появляются динамически, т. е. пользовательский ввод.Я использую базу данных SQL.

1 Ответ

1 голос
/ 30 ноября 2011

Это было адаптировано из кода, который у меня уже есть ... может быть одна или две ошибки, но суть будет работать (это работает в моем коде).В идеале подобные вещи должны выполняться с помощью инструмента ORM, такого как Hiberante.

По сути, вы настраиваете пакетное обновление, а затем запускаете Statement.executeBatch () для фактического обновления.Вы возвращаетесь с массивом int [] с результатами.Вы проверяете их по списку предопределенных констант, чтобы увидеть, что происходит.Это НАМНОГО быстрее, чем просто выполнять каждое обновление отдельно.Кроме того, вы можете объединить все обновления в одну транзакцию, упрощая откат.

public void updateResNames(List<ResAllocationDTO> list) {
    String sql = "UPDATE res_allocation SET ResName = ? WHERE PID = ?";
    PreparedStatement statement = null;
    try {
        statement = connection.prepareStatement(sql);
        for (ResAllocationDTO dto : list) {
            statement.setString(1, dto.getResName());
            statement.setString(2, dto.getPID());
            statement.addBatch();
        }
        int[] result = statement.executeBatch();
        for (int i = 0; i < result.length; i++) {
            if (result[i] == PreparedStatement.EXECUTE_FAILED) {
                throw new SQLException(String.format("Entry %d failed to execute in the batch insert with a return code of %d.", i, result[i]));
            }
        }
        commit();
    } catch (SQLException e) {
        logger.error(LoggerCodes.DATABASE_ERROR, e);
        rollback();
        throw new RuntimeException(e);
    } finally {
        close(statement);
    }
}

commit (), close () и rollback () выглядит следующим образом:

public void close(PreparedStatement statement) {
    try {
        if (statement != null && !statement.isClosed())
            statement.close();
    } catch (SQLException e) {
        logger.debug(LoggerCodes.TRACE, "Warning! PreparedStatement could not be closed.");
    }
}

protected void commit() {
    try {
        if ((connection != null) && !connection.getAutoCommit()) {
            connection.commit();
        }
    } catch (SQLException e) {
        logger.debug(LoggerCodes.TRACE, "Warning! ResultSet could not be closed after commit.");
    }
}

protected void rollback() {
    try {
        if ((connection != null) && !connection.getAutoCommit()) {
            connection.rollback();
        }
    } catch (SQLException e) {
        logger.debug(LoggerCodes.TRACE, "Warning! ResultSet could not be closed after rollback.");
    }
}

Iнадеюсь, это поможет вам!Удачи и удачного кодирования!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...