Возвращает количество строк, затронутых оператором SQL UPDATE в Java - PullRequest
31 голосов
/ 03 апреля 2010

Я использую базу данных MySQL и обращаюсь к ней через Java.

PreparedStatement prep1 = this.connection.prepareStatement("UPDATE user_table 
                                                               SET Level = 'Super' 
                                                             WHERE Username = ?");
prep1.setString(1, username);

Оператор обновления выше работает нормально, однако я бы хотел получить количество строк, затронутых этим оператором. Возможно ли это, пожалуйста?

Ответы [ 7 ]

41 голосов
/ 03 апреля 2010

Вызов executeUpdate () в вашем PreparedStatement должен возвращать int, количество обновленных записей.

39 голосов
/ 14 февраля 2014

Statement.executeUpdate() или execute(), за которыми следует getUpdateCount(), возвращает количество строк соответствует , а не обновляется , согласно спецификации JDBC. Если вы хотите обновить счетчик, вы можете указать useAffectedRows=true как нестандартный параметр URL . Более подробная информация доступна здесь .

5 голосов
/ 10 ноября 2016
  1. Прежде всего, подготовьте объект 'PreparedStatement', используя конструктор ниже:

    PreparedStatement pStmt = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
    //here variable 'sql' is your query ("UPDATE user_table SET Level = 'Super' WHERE Username = ?") 
    
  2. Затем установите аргумент 'pStmt'. В этом случае:

    prep1.setString(1, username);
    
  3. Наконец, executeUpdate и получить затронутые строки в виде целого числа

    int affectedRows = pStmt.executeUpdate();
    
3 голосов
/ 07 октября 2015

Рассматривая это только сейчас для другой аналогичной ситуации, когда я хочу выполнять дополнительную работу, только если что-то действительно изменилось, я думаю, что наиболее нейтральным платформой способом было бы изменить запрос, чтобы исключить случай, когда заданные поля матч:

UPDATE user_table SET Level = 'Super' WHERE Username = ? AND Level <> 'Super'
1 голос
/ 03 апреля 2010

Это число возвращается при запуске запроса:

int rows = prep1.executeUpdate(); 
System.out.printf("%d row(s) updated!", rows); 
0 голосов
/ 14 августа 2015

Количество строк, затронутых обновлением SQL, можно вернуть с помощью SQL% ROWCOUNT (для ORACLE) или @@ ROWCOUNT (для SQL SERVER)

Примечание. Чтобы вернуть количество обновленных, удаленных и т. Д. Строк, мы должны использовать параметр OUT в хранимой процедуре, который будет хранить количество обновленных, удаленных и т. Д. Строк.

  1. Чтобы получить количество обновленных, удаленных и т. Д. Строк, мы должны использовать Метод registerOutParameter в Java

  2. Для сохранения количества обновленных или удаленных строк и т. Д. В одну из Параметр OUT в хранимой процедуре, мы должны установить тип этого параметр в нашем скрипте перед выполнением команды. (В случае Обновите или удалите это будет ЧИСЛО)

  3. После выполнения команды сохраните значение обновленного или удаленного строки в переменную (это может быть новая переменная или переменные доступны в классе и т. д.), вызывая индекс этого параметра (например: A = cs.getInt (3), если параметр OUT в хранимой процедуре 2-й параметр)

  4. Теперь переменная имеет значение обновленных или удаленных строк. (I.e.A = 10)

Пример для хранимой порции

Function demo( A varchar2(10), B OUT NUMBER)RETURN NUMBER IS EXIST_LP NUMBER;
BEGIN
UPDATE demo_temp SET name=A where name="ABC";
B:=SQL%ROWCOUNT -- total number of rows updated
RETRUN EXIST_LP;
END demo;

Пример для сценария Java

public void update(demo demo){
int rowCount = 0;
Connection conn = null;
CallableStatement cs = null;
try{
InitialContext ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("your data source path");
conn = ds.getConnection();
cs = conn.prepareCall("BEGIN ? :=demo_dbp.demo(?,?) ); END;"); // stored proc
cs.registerOutParameter(1, Types.INTEGER);
cs.setString(2, "XYZ");
cs.registerOutParameter(3, Types.NUMERIC);
rowCount=cs.execcuteUpdate();
demo.setUpdateCount(cs.getInt(3));
} catch (SQLException exc) {
  throw new DaoException("An SQL Exception has occurred.", exc);
} catch (NamingException ne) {
  throw new DaoException("A Naming Exception has occurred.", ne);
} catch (Exception e) {
  throw new DaoException("An Exception has occurred", e);
} finally {

  try {
            if (cs != null) {
                cs.close();
            }
} catch (SQLException ex1) {
}
try {
            if (conn != null) {
                conn.close();
            }
} catch (SQLException ex) {
}

}
}

Примечание: executeUpdate () не возвращает количество обновленных или удаленных строк. Он просто возвращает 0 или 1.

  1. 0 - Ошибка выполнения
  2. 1 - Успешное выполнение
0 голосов
/ 03 апреля 2010

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

...