executeupdate - Devuelve el número de filas afectadas por la instrucción SQL UPDATE en Java
executeupdate java (7)
Estoy usando una base de datos MySQL y accediendo a ella a través de Java.
PreparedStatement prep1 = this.connection.prepareStatement("UPDATE user_table
SET Level = ''Super''
WHERE Username = ?");
prep1.setString(1, username);
La declaración de actualización anterior funciona bien, sin embargo, me gustaría obtener el número de filas afectadas con esta declaración. ¿Es esto posible por favor?
En primer lugar, prepare el objeto ''PreparedStatement'' usando el siguiente constructor:
PreparedStatement pStmt = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); //here variable ''sql'' is your query ("UPDATE user_table SET Level = ''Super'' WHERE Username = ?")
Luego, establece tu argumento en ''pStmt''. En este caso:
prep1.setString(1, username);
Finalmente, ejecuteUpdate y obtenga las filas afectadas como un entero
int affectedRows = pStmt.executeUpdate();
El número de filas afectadas por la Actualización de SQL se puede devolver usando SQL% ROWCOUNT (para ORACLE) o @@ ROWCOUNT (PARA EL SERVIDOR DE SQL)
Nota: Para devolver el número de filas actualizadas, eliminadas, etc., tenemos que usar el parámetro OUT en el Procedimiento almacenado que almacenará la cantidad de filas actualizadas, eliminadas, etc.
Para obtener el número de filas actualizadas, eliminadas, etc., tenemos que usar el método registerOutParameter en Java
Para almacenar el número de filas actualizadas o eliminadas, etc., en uno de los parámetros OUT en el procedimiento almacenado, debemos configurar el tipo de ese parámetro en nuestro script antes de ejecutar el comando. (En caso de actualización o borrado será NUMÉRICO)
Una vez que se ejecuta el comando, almacene el valor de las filas actualizadas o eliminadas en la variable (puede ser una nueva variable o variables disponibles en la clase, etc.) llamando al índice de ese parámetro (por ejemplo: A = cs.getInt (3 ) si el parámetro OUT en el procedimiento almacenado es el segundo parámetro)
Ahora, la variable tiene el valor de filas actualizadas o eliminadas (es decir, A = 10)
Ejemplo de porcedura almacenada
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;
Ejemplo para script 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) {
}
}
}
Nota: executeUpdate () no devuelve el número de filas actualizadas o eliminadas. Solo devuelve 0 o 1.
- 0 - Ejecución fallida
- 1 - Ejecución exitosa
Ese número se devuelve cuando ejecuta la consulta:
int rows = prep1.executeUpdate();
System.out.printf("%d row(s) updated!", rows);
Llamar a executeUpdate() en su PreparedStatement debe devolver un int, el número de registros actualizados.
Si es necesario saber cuántas filas se verán afectadas sin ejecutarlo, primero deberá ejecutar una instrucción SELECT.
Viendo esto ahora para otra situación similar, donde solo quiero hacer trabajo adicional si algo realmente cambia, creo que la forma más neutral de hacerlo sería modificar la consulta para excluir el caso en el que coinciden los campos establecidos:
UPDATE user_table SET Level = ''Super'' WHERE Username = ? AND Level <> ''Super''
Statement.executeUpdate()
o execute()
seguido de getUpdateCount()
devolverá el número de filas coincidentes , no actualizadas , de acuerdo con las especificaciones de JDBC. Si desea el recuento actualizado, puede especificar useAffectedRows=true
como una opción de URL no estándar . Más información está disponible here .