Подтвердить что ты не робот

Получить количество записей, на которые влияет INSERT или UPDATE в PostgreSQL

Мой драйвер базы данных для PostgreSQL 8/9 не возвращает количество записей, затронутых при выполнении INSERT или UPDATE.

PostgreSQL предлагает нестандартный синтаксис RETURNING", который кажется хорошим обходным решением. Но какой может быть синтаксис? В примере возвращается идентификатор записи, но мне нужен счет.

INSERT INTO дистрибьюторы (did, dname) VALUES (DEFAULT, 'XYZ Widgets')     RETURNING сделал;

4b9b3361

Ответ 1

Я знаю, что этот вопрос является оооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооо

В любом случае, я должен был сделать то же самое и заставить его работать следующим образом:

-- 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;

На днях мне действительно нужно разобраться с написанием любовного сонета для предложения PostgreSQL WITH...

Ответ 2

Я согласен с Миленом, ваш водитель должен сделать это за вас. Какой драйвер вы используете и на каком языке? Но если вы используете plpgsql, вы можете использовать GET DIAGNOSTICS my_var = ROW_COUNT;

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

Ответ 3

Из вашего вопроса не ясно, как вы вызываете оператор. Предполагая, что вы используете что-то вроде JDBC, вы можете назвать его скорее запросом, чем обновлением. Из JDBC executeQuery:

Выполняет данный оператор SQL, который возвращает один ResultSet объект.

Поэтому это целесообразно, когда вы выполняете оператор, который возвращает некоторые результаты запроса, такие как SELECT или INSERT ... RETURNING. Если вы делаете обновление базы данных, а затем хотите знать, сколько кортежей было затронуто, вам нужно использовать executeUpdate, который возвращает:

либо (1) количество строк для языка данных SQL Data Manipulation Language (DML) операторов или (2) 0 для операторов SQL, которые ничего не возвращают