2010-04-03 26 views
24

Estoy usando una base de datos MySQL y accediendo a ella a través de Java.Devuelve el número de filas afectadas por la instrucción SQL UPDATE en 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 pero me gustaría obtener el número de filas afectadas con esta declaración. ¿Es esto posible por favor?

Respuesta

36

Calling executeUpdate() en su PreparedStatement debe devolver un entero, el número de registros actualizados.

+0

preciosas :) Gracias chicos –

+4

En realidad, yo estoy teniendo un problema con esto. Cuando ejecuto una actualización para una columna con el valor X y trato de actualizarla a X, una consulta en bruto mysql devuelve 0 como filas afectadas, pero la declaración preparada de Java devuelve los números de las filas, incluso si X nunca cambió. –

+7

No es realmente la cantidad de registros actualizados, es la cantidad de registros coincidentes, lamentablemente. En mi configuración (MySQL), obtengo 1 para el valor de retorno de executeUpdate() cuando actualizo un valor con el mismo valor pero cuando ejecuto la consulta manualmente en Workbench, dice: 0 fila (s) afectadas Filas coincidentes: 1 cambiado : 0 Advertencias: 0 – mikato

1

Ese número se devuelve al ejecutar la consulta:

int rows = prep1.executeUpdate(); 
System.out.printf("%d row(s) updated!", rows); 
0

Si es necesario saber cuántas filas se verán afectadas sin ejecutarlas, primero deberá ejecutar una instrucción SELECT.

30

Statement.executeUpdate() o execute() seguido de getUpdateCount() devolverá el número de filas emparejados, no actualizado, de acuerdo con la especificación JDBC. Si desea la cuenta actualizada, puede especificar useAffectedRows=true como non-standard URL option. Más información está disponible here.

+6

Esta es la respuesta correcta, una aceptada es incorrecta. – Wrench

+0

Desafortunadamente, el enlace O'Reilly está muerto ... – amaidment

+0

@amaidment: Gracias por informarme. Reemplacé el enlace con uno del Archivo de Internet. –

0

El número de filas afectadas por SQL de actualización puede ser devuelto utilizando% ROWCOUNT de SQL (Oracle) o @@ ROWCOUNT (para el servidor SQL)

Nota: Con el fin de devolver el número de filas actualizadas, eliminado etc .. tenemos que utilizar OUT Parámetro de procedimiento almacenado que almacenará el número de filas actualizadas, etc .. borra

  1. para obtener el número de filas actualizado, eliminado etc .. tenemos que utilizar registerOutParameter método en Java

  2. Para almacenar el número de filas actualizadas o eliminadas, etc. en uno de los parámetros OUT en el procedimiento almacenado, debemos establecer el tipo de ese parámetro en nuestro script antes de ejecutar el comando. (En caso de actualizar o borrar va a ser numérico)

  3. Una vez ejecutado el comando, almacenar el valor de actualizados o eliminados filas en la variable (Puede ser nueva variable o variables de disponibles en clase, etc. .) llamando el índice de dicho parámetro (por ejemplo: a = cs.getInt (3) si el parámetro OUT en procedimiento almacenado es segundo parámetro)

  4. Ahora, la variable tiene el valor de Actualización o eliminado filas (ieA = 10)

Ejemplo para porcedure almacenados

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 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) { 
} 

} 
} 

Nota: executeUpdate() no devuelve el número de filas actualizadas o suprimidas.Simplemente devuelve 0 o 1.

  1. 0 - Ejecución Error
  2. 1 - Ejecución éxito
1

En cuanto a este justo ahora para otra situación similar, donde sólo quiero hacer un trabajo adicional si algo ha cambiado realmente, creo que la forma neutra plataforma más para hacerlo sería alterar la consulta para excluir el caso en que los campos de conjunto coinciden:

UPDATE user_table SET Level = 'Super' WHERE Username = ? AND Level <> 'Super' 
+0

¿Cómo responde esto la pregunta del OP? –

+0

Fácil, debe agregar condiciones adicionales a la cláusula where para limitar el número de filas devueltas a ser igual al número de filas afectadas. (Al menos para trabajar en su cliente Java) –

+0

Ya veo. El punto que estaba haciendo es que la pregunta le pide a _how_ recuperar ese número en Java. Su respuesta no explica eso (mire la respuesta aceptada, que _desea_ explicar esto). Sin embargo, a juzgar por los comentarios, parece que su respuesta podría ser una buena adición a la respuesta aceptada. –

1
  1. En primer lugar, preparar el objeto 'PreparedStatement' mediante 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 = ?") 
    
  2. A continuación, establezca su argumento a 'pstmt'. En este caso:

    prep1.setString(1, username); 
    
  3. filas Finalmente, executeUpdate y se vea afectado como un entero

    int affectedRows = pStmt.executeUpdate(); 
    
+0

¿Por qué nadie vota este código? – gumuruh

Cuestiones relacionadas