2010-02-12 14 views
19

Sto cercando un modo per restituire il numero di righe interessate da una clausola DELETE in PostgreSQL. Lo documentation afferma che;Come ottenere il numero di righe cancellate in PostgreSQL?

In caso di successo, un comando DELETE restituisce un tag comando della modulo

conteggio DELETE

Il conteggio è il numero di righe eliminati. Se il conteggio è 0, nessuna riga corrisponde alla condizione (questo non è considerato un errore).

Se il comando DELETE contiene una RETURNING clausola , il risultato sarà simile a quella di un'istruzione SELECT contenente le colonne e valori definiti nell'elenco RITORNO, calcolato su riga (s) cancellato dal il comando.

Ma ho difficoltà a trovare un buon esempio. Qualcuno può aiutarmi con questo, come posso sapere quante righe sono state cancellate?


EDIT: Ho accettato la soluzione di Milen, ma ho voluto presentare un'alternativa che ho trovato più tardi. Può essere trovato in here, spiegato sotto 38.5.5. Ottenimento dello stato dei risultati titolo.

+0

Rapporto con linguaggio di scripting? Perl, PHP, Python, C, Klingon? – Paul

+0

Il linguaggio è Java –

+0

Grazie mille. Il tuo link è stato molto utile – jny

risposta

-1

È necessaria la funzione PQcmdTuples da libpq. Quale in PHP, per esempio, è incapsulato come pg_affected_rows.

+0

Lo esaminerò domani, grazie per la risposta –

4

Questo dovrebbe essere semplice in Java.

Statement stmt = connection.createStatement(); 
int rowsAffected = stmt.executeUpdate("delete from your_table"); 
System.out.println("deleted: " + rowsAffected); 

Vedere java.sql.Statement.

+1

Questa domanda non ha nulla a che fare con java .... – Nate

+4

@Nate, nel secondo commento sulla domanda l'OP afferma: "La lingua è Giava." – cope360

+0

questa dovrebbe essere la risposta accettata – Tom

2

in Python utilizzando psycopg2, è possibile utilizzare l'attributo rowcount. Ecco un esempio per scoprire quante righe sono state eliminate ...

cur = connection.cursor() 
try: 
    cur.execute("DELETE FROM table WHERE col1 = %s", (value,)) 
    connection.commit() 
    count = cur.rowcount 
    cur.close() 
    print("A total of %s rows were deleted." % count) 
except: 
    connection.rollback() 
    print("An error as occurred, No rows were deleted") 
28

È possibile utilizzare RETURNING clausola:

DELETE FROM table WHERE condition IS TRUE RETURNING *; 

Dopo di che basta controllare il numero di righe restituite. Si può semplificare con CTE:

WITH deleted AS (DELETE FROM table WHERE condition IS TRUE RETURNING *) SELECT count(*) FROM deleted; 

Ciò dovrebbe restituire solo il numero di righe eliminate.

+1

Penso che questo dovrebbe essere contrassegnato come accettato. – MaNKuR

+1

Funziona senza un'estensione! La risposta dovrebbe essere sicuramente la risposta accettata: D – Alfabravo

1

GET DIAGNOSTICS viene utilizzato per visualizzare il numero di record modificati/cancellati.

codice di esempio

CREATE OR REPLACE FUNCTION fnName() 
    RETURNS void AS 
$BODY$ 
     declare 
     count numeric; 
     begin 
       count := 0; 
      LOOP 
      -- condition here update or delete; 
      GET DIAGNOSTICS count = ROW_COUNT; 
      raise notice 'Value: %', count; 
      end loop; 
     end; 
$BODY$a 
Problemi correlati