2010-04-03 10 views
24

Sto utilizzando un database MySQL e accedendo tramite Java.Restituisce il numero di righe interessate dall'istruzione SQL UPDATE in Java

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

La dichiarazione di aggiornamento di cui sopra funziona bene però mi piacerebbe ottenere il numero di righe interessate con questa affermazione. È possibile, per favore?

risposta

36

Calling executeUpdate() sul PreparedStatement dovrebbe restituire un int, il numero di record aggiornati.

+0

Amabili :) Grazie ragazzi –

+4

In realtà io sto avendo un problema con questo. Quando eseguo un aggiornamento per una colonna con valore X e cerco di aggiornarlo a X di una query mysql non elaborata restituisce 0 come righe interessate MA L'istruzione java preparata restituisce il numero di righe anche se X non è mai stato modificato. –

+7

In realtà non è il numero di record aggiornati, ma sfortunatamente è il numero di record corrispondenti. Nella mia configurazione (MySQL), ottengo 1 per il valore di ritorno di executeUpdate() quando aggiorno un valore allo stesso valore ma quando eseguo manualmente la query in Workbench, si dice: 0 riga (e) interessata Righe corrispondenti: 1 Modificato : 0 Avvisi: 0 – mikato

1

Questo numero viene restituito quando si esegue la query:

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

Se è necessario sapere quante righe saranno interessate senza eseguirlo, sarà necessario eseguire prima un'istruzione SELECT.

30

Statement.executeUpdate() o execute() seguita da getUpdateCount() restituisce il numero di righe corrispondenti , non aggiornato, secondo le specifiche JDBC. Se si desidera il conteggio aggiornato, è possibile specificare useAffectedRows=true come non-standard URL option. Ulteriori informazioni sono disponibili here.

+6

Questa è la risposta corretta, quella accettata è sbagliata. – Wrench

+0

Sfortunatamente, il collegamento O'Reilly è morto ... – amaidment

+0

@amaidment: Grazie per avermelo fatto notare. Ho sostituito il collegamento con uno da Internet Archive. –

0

Il numero di righe interessate da SQL Update può essere restituito utilizzando SQL% ROWCOUNT (per Oracle) o @@ ROWCOUNT (per SQL Server)

Nota: Al fine di restituire il numero di righe aggiornate, cancellati, ecc .. dobbiamo usare OUT Parametro in stored procedure che memorizzare il numero di righe aggiornate, cancellato ecc ..

  1. per ottenere il numero di righe aggiornate, eliminate ecc .. dobbiamo usare registerOutParameter metodo in Java

  2. Per memorizzare il numero di righe aggiornate o cancellate ecc. In uno dei parametri OUT nella stored procedure, dobbiamo impostare il tipo di quel parametro nel nostro script prima di eseguire il comando. (In caso di aggiornare o cancellare sarà numerico)

  3. Una volta che il comando viene eseguito, memorizzare il valore di aggiornamento o la cancellazione righe nella variabile (può essere nuovo variabile o variabili disponibili in classe etc. .) chiamando l'indice di quel parametro (es: a = cs.getInt (3) se il parametro OUT nella stored procedure è 2 ° parametro)

  4. Ora, la variabile ha il valore di aggiornamento o eliminato righe (ieA = 10)

Esempio per porcedure memorizzato

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; 

Esempio di 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() non restituisce il numero di righe aggiornate o cancellati.Restituisce solo 0 o 1.

  1. 0 - Esecuzione non riuscita
  2. 1 - Esecuzione Successo
1

Guardando a questo solo ora un'altra situazione simile, in cui voglio solo fare del lavoro in più se qualcosa di veramente cambiato, penso che il modo neutro più piattaforma per farlo sarebbe quello di modificare la query di escludere il caso in cui i campi set Match:

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

Come risponde la domanda dell'OP? –

+0

Facile, è necessario aggiungere condizioni aggiuntive alla clausola where per limitare il numero di righe restituite uguali al numero di righe interessate. (Almeno per lavorare nel suo client Java) –

+0

vedo. Il punto che stavo facendo è che la domanda chiede a _how_ di recuperare quel numero in Java. La tua risposta non lo spiega (guarda la risposta accettata, che spiega questo). Tuttavia, a giudicare dai commenti sembra che la tua risposta potrebbe essere una buona aggiunta alla risposta accettata. –

1
  1. Prima di tutto, preparare l'oggetto 'PreparedStatement' usando sotto costruttore:

    PreparedStatement pStmt = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); 
    //here variable 'sql' is your query ("UPDATE user_table SET Level = 'Super' WHERE Username = ?") 
    
  2. Poi, impostare il vostro argomento di 'pStmt'. In questo caso:

    prep1.setString(1, username); 
    
  3. filari Infine, executeUpdate e ottenere colpiti come un intero

    int affectedRows = pStmt.executeUpdate(); 
    
+0

perché nessuno ha votato questo codice? – gumuruh

Problemi correlati