web-dev-qa-db-fra.com

Obtenir le nombre d'enregistrements affectés par INSERT ou UPDATE dans PostgreSQL

Mon pilote de base de données pour PostgreSQL 8/9 ne renvoie pas le nombre d'enregistrements affectés lors de l'exécution de INSERT ou UPDATE

PostgreSQL fournit la syntaxe non standard " RETOURNANT ", ce qui semble être une bonne solution de contournement. Mais quelle pourrait être la syntaxe? L'exemple retourne l'ID d'un enregistrement, mais j'ai besoin d'un compte.

INSCRIRE DANS les distributeurs (did, dname) VALUES (DEFAULT, 'XYZ Widgets') RETURNING a fait;

41
Un Homme

Je sais que cette question est oooolllllld et que ma solution est peut-être excessivement complexe, mais c'est le type de solution que je préfère!

Quoi qu'il en soit, je devais faire la même chose et le faire fonctionner comme ceci:

-- Get count from INSERT
WITH rows AS (
    INSERT INTO distributors
        (did, dname)
    VALUES
        (DEFAULT, 'XYZ Widgets'),
        (DEFAULT, 'ABC Widgets')
    RETURNING 1
)
SELECT count(*) FROM rows;

-- Get count from UPDATE
WITH rows AS (
    UPDATE distributors
    SET dname = 'JKL Widgets'
    WHERE did <= 10
    RETURNING 1
)
SELECT count(*) FROM rows;

Un de ces jours, je dois vraiment écrire un sonnet d'amour pour la clause WITH de PostgreSQL ...

55
mercurial

Je suis d’accord avec Milen, ton chauffeur devrait le faire pour toi. Quel pilote utilisez-vous et pour quelle langue? Mais si vous utilisez plpgsql, vous pouvez utiliser GET DIAGNOSTICS my_var = ROW_COUNT;

http://www.postgresql.org/docs/current/static/plpgsql-statements.html

18
Scott Bailey

Vous pouvez prendre ROW_COUNT après la mise à jour ou insérer avec ce code:

insert into distributors (did, dname) values (DEFAULT, 'XYZ Widgets');
get diagnostics v_cnt = row_count;
2
Igor Cova

Votre question ne dit pas comment vous appelez la déclaration. En supposant que vous utilisiez quelque chose comme JDBC, vous l'appelez peut-être comme une requête plutôt que comme une mise à jour. De JDBC's executeQuery :

Exécute l'instruction SQL donnée, qui retourne un seul ResultSet objet.

Ceci est donc approprié lorsque vous exécutez une instruction qui renvoie des résultats de requête, tels que SELECT ou INSERT ... RETURNING. Si vous effectuez une mise à jour de la base de données et souhaitez ensuite savoir combien de n-uplets ont été affectés, vous devez utiliser executeUpdate qui renvoie:

soit (1) le nombre de lignes pour le langage DML (SQL Data Manipulation Language) instructions ou (2) 0 pour les instructions SQL qui ne renvoient rien

0
beldaz