web-dev-qa-db-fra.com

Renvoie le nombre de lignes affectées par l'instruction SQL UPDATE dans Java

J'utilise une base de données MySQL et j'y accède via Java.

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

L'instruction de mise à jour ci-dessus fonctionne correctement, mais j'aimerais obtenir le nombre de lignes affectées avec cette instruction. Est-ce possible, s'il vous plaît?

31
Krt_Malta

L'appel executeUpdate () sur votre PreparedStatement devrait retourner un entier, le nombre d'enregistrements mis à jour.

42
brabster

Statement.executeUpdate() ou execute() suivi de getUpdateCount() renverra le nombre de lignes correspondant , pas mis à jour , selon la spécification JDBC. Si vous souhaitez que le nombre mis à jour, vous pouvez spécifier useAffectedRows=true en tant que option URL non standard . Plus d'informations sont disponibles ici .

41
Trevor Robinson
  1. Tout d'abord, préparez l'objet 'PreparedStatement' en utilisant le constructeur ci-dessous:

    PreparedStatement pStmt = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
    //here variable 'sql' is your query ("UPDATE user_table SET Level = 'Super' WHERE Username = ?") 
    
  2. Ensuite, définissez votre argument sur 'pStmt'. Dans ce cas:

    prep1.setString(1, username);
    
  3. Enfin, executeUpdate et obtenez les lignes affectées sous forme d'entier

    int affectedRows = pStmt.executeUpdate();
    
5
Lakshitha Kanchana

En regardant cela tout à l'heure pour une autre situation similaire, où je ne veux faire un travail supplémentaire que si quelque chose a vraiment changé, je pense que la façon la plus neutre de le faire serait de modifier la requête pour exclure le cas où les champs définis correspondent:

UPDATE user_table SET Level = 'Super' WHERE Username = ? AND Level <> 'Super'
3
James West

Ce numéro est renvoyé lorsque vous exécutez la requête:

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

S'il est nécessaire de savoir combien de lignes seront affectées sans l'exécuter, vous devrez d'abord exécuter une instruction SELECT.

0
Michael Munsey

Le nombre de lignes affectées par SQL Update peut être renvoyé à l'aide de SQL% ROWCOUNT (pour Oracle) ou @@ ROWCOUNT (POUR SQL SERVER)

Remarque: Afin de retourner le nombre de lignes mises à jour, supprimées, etc., nous devons utiliser le paramètre OUT dans la procédure stockée qui stockera le nombre de lignes mises à jour, supprimées, etc.

  1. Pour obtenir le nombre de lignes mises à jour, supprimées, etc., nous devons utiliser la méthode registerOutParameter en Java

  2. Pour stocker le nombre de lignes mises à jour ou supprimées, etc. dans l'un des paramètres OUT de la procédure stockée, nous devons définir le type de ce paramètre dans notre script avant d'exécuter la commande. (En cas de mise à jour ou de suppression, ce sera NUMÉRIQUE)

  3. Une fois la commande exécutée, stockez la valeur des lignes mises à jour ou supprimées dans la variable (Il peut s'agir de nouvelles variables ou de variables disponibles dans la classe etc.) en appelant l'index de ce paramètre (par exemple: A = cs.getInt (3 ) si le paramètre OUT dans la procédure stockée est le 2ème paramètre)

  4. Maintenant, la variable a la valeur de lignes mises à jour ou supprimées (c'est-à-dire A = 10)

Exemple de porcedure stockée

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;

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

}
}

Remarque: executeUpdate () ne renvoie pas le nombre de lignes mises à jour ou supprimées. Il renvoie simplement 0 ou 1.

  1. 0 - Échec de l'exécution
  2. 1 - Succès d'exécution
0
pvkrdy