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