Retourne le nombre de lignes affectées par L'instruction SQL UPDATE en 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 update ci-dessus fonctionne bien mais je voudrais obtenir le nombre de lignes affectées par cette instruction. Est-ce possible s'il vous plaît?
7 réponses
Appeler executeUpdate() sur votre PreparedStatement devrait renvoyer un int, le nombre d'enregistrements mis à jour.
Statement.executeUpdate()
ou execute()
, suivie par getUpdateCount()
retourne le nombre de lignes appariés, pas mise à jour, selon le JDBC spec. Si vous voulez le nombre mis à jour, vous pouvez spécifier useAffectedRows=true
comme option D'URL non standard . Plus d'informations sont disponibles ici.
-
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 = ?")
-
Ensuite, définissez votre argument sur 'pStmt'. Dans ce cas:
prep1.setString(1, username);
-
Enfin, executeUpdate et get lignes affectées comme un entier
int affectedRows = pStmt.executeUpdate();
En regardant cela tout à l'heure pour une autre situation similaire, où je veux seulement faire un travail supplémentaire 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 set correspondent:
UPDATE user_table SET Level = 'Super' WHERE Username = ? AND Level <> 'Super'
Ce nombre est retourné lorsque vous exécutez la requête:
int rows = prep1.executeUpdate();
System.out.printf("%d row(s) updated!", rows);
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.
Le nombre de lignes affectées par SQL Update peut être retourné en utilisant SQL % ROWCOUNT(pour ORACLE) ou @@ROWCOUNT (pour SQL SERVER)
Note: afin de renvoyer 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..
-
Pour obtenir le nombre de lignes mises à jour,supprimées etc.. nous devons utiliser méthode registerOutParameter en Java
-
Pour stocker le nombre de lignes mises à jour ou supprimé etc.. dans l'une des Out paramètre dans la procédure stockée nous devons définir le type de cela paramètre dans notre script avant d'exécuter la commande. (En cas de Mettre à jour ou supprimer sera numérique)
Une fois la commande exécutée, stockez la valeur de updated ou deleted lignes dans la variable (il peut s'agir d'une nouvelle variable ou de variables disponible en classe, etc.. en composant l'indice de paramètre (par exemple: A = cs.getInt (3) si le paramètre OUT dans la procédure stockée est 2e paramètre)
Maintenant, la variable a la valeur de lignes mises à jour ou supprimées (c.-à-d.=10)
Exemple pour Porcedure stocké
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 de 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) {
}
}
}
Remarque: executeUpdate () ne renvoie pas le nombre de lignes mises à jour ou supprimées. Il renvoie juste 0 ou 1.
- 0 -- Échec De L'Exécution
- 1 -- Succès D'Exécution