Ответ 1
Вам нужна функция PQcmdTuples
из libpq
. Что в PHP, например, завернуто как pg_affected_rows
.
Я ищу способ вернуть число строк, затронутых предложением DELETE в PostgreSQL. В документации указано, что:
При успешном завершении DELETE команда возвращает тэг команды форма
УДАЛИТЬ счетчик
Число - это количество строк удален. Если count равен 0, строк нет соответствует условию (это не считается ошибкой).
Если команда DELETE содержит RETURNING, результат будет аналогично выражению SELECT содержащие столбцы и значения определенный в списке ВОЗВРАЩАЕМОСТИ, вычисляется по строке (-ам), удаленной команда.
Но мне трудно найти хороший пример. Может ли кто-нибудь помочь мне с этим, как я могу узнать, сколько строк было удалено?
EDIT: Я принял решение Милена, но я хотел представить альтернативу, которую я нашел позже. Его можно найти в здесь, как описано в разделе 38.5.5. Получение названия статуса результата.
Вам нужна функция PQcmdTuples
из libpq
. Что в PHP, например, завернуто как pg_affected_rows
.
Вы можете использовать предложение RETURNING
:
DELETE FROM table WHERE condition IS TRUE RETURNING *;
После этого вам просто нужно проверить количество возвращенных строк. Вы можете упорядочить его с помощью CTE:
WITH deleted AS (DELETE FROM table WHERE condition IS TRUE RETURNING *) SELECT count(*) FROM deleted;
Это должно возвращать только количество удаленных строк.
Это должно быть простым в Java.
Statement stmt = connection.createStatement();
int rowsAffected = stmt.executeUpdate("delete from your_table");
System.out.println("deleted: " + rowsAffected);
См. Java.sql.Statement.
в Python с использованием psycopg2 можно использовать атрибут rowcount. Вот пример, чтобы узнать, сколько строк было удалено...
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")
GET DIAGNOSTICS используется для отображения числа измененных/удаленных записей.
Пример кода
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