Ответ 1
Вызов executeUpdate() на вашем PreparedStatement должен вернуть int, количество обновленных записей.
Я использую базу данных MySQL и получаю ее через Java.
PreparedStatement prep1 = this.connection.prepareStatement("UPDATE user_table
SET Level = 'Super'
WHERE Username = ?");
prep1.setString(1, username);
Оператор update выше работает отлично, но я хотел бы получить количество строк, затронутых этим утверждением. Возможно ли это?
Вызов executeUpdate() на вашем PreparedStatement должен вернуть int, количество обновленных записей.
Statement.executeUpdate()
или execute()
, за которым следует getUpdateCount()
, будет возвращено количество совпадающих строк, а не обновлено в соответствии со спецификацией JDBC. Если вы хотите обновить счетчик, вы можете указать useAffectedRows=true
как параметр нестандартного URL. Более подробная информация доступна здесь.
Взглянув на это сейчас, на другую аналогичную ситуацию, где я только хочу сделать дополнительную работу, если что-то действительно изменилось, я думаю, что наиболее нейтральным способом для этой платформы является изменение запроса, чтобы исключить случай, когда заданные поля матч:
UPDATE user_table SET Level = 'Super' WHERE Username = ? AND Level <> 'Super'
Это число возвращается при запуске запроса:
int rows = prep1.executeUpdate();
System.out.printf("%d row(s) updated!", rows);
Прежде всего, подготовьте объект "PreparedStatement", используя следующий конструктор:
PreparedStatement pStmt = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
//here variable 'sql' is your query ("UPDATE user_table SET Level = 'Super' WHERE Username = ?")
Затем установите аргумент 'pStmt'. В этом случае:
prep1.setString(1, username);
Наконец, executeUpdate и получить затронутые строки как целое число
int affectedRows = pStmt.executeUpdate();
Если вам необходимо знать, сколько строк будет затронуто без его выполнения, сначала вам нужно будет выполнить инструкцию SELECT.
Число строк, затронутых SQL Update, может быть возвращено с использованием SQL% ROWCOUNT (для ORACLE) или @@ROWCOUNT (FOR SQL SERVER)
Примечание. Чтобы вернуть число строк, обновленных, удаленных и т.д., мы должны использовать параметр OUT в хранимой процедуре, который будет хранить количество обновленных строк, удаленных и т.д.
Чтобы получить количество обновленных строк, удалить и т.д., мы должны использовать registerOutParameter метод в Java
Чтобы сохранить количество обновленных или удаленных строк и т.д. в один из OUT в хранимой процедуре мы должны установить тип этого в нашем script перед выполнением команды. (В случае Обновить или удалить его будет ЧИСЛЕННО)
После выполнения команды сохраните значение обновленного или удаленного строки в переменную (это может быть новая переменная или переменные доступный в классе и т.д.) путем вызова индекса этого параметра (например: A = cs.getInt(3), если параметр OUT в хранимой процедуре 2-й параметр)
Теперь переменная имеет значение Обновленных или удаленных строк (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 script
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.