如何返回在postgresql函数中删除的行数

Mic*_*ael 5 postgresql

这是我正在尝试做的一个非常简化的示例。考虑这张人表:

CREATE TABLE people (pid SERIAL PRIMARY KEY, firstname TEXT, isalive BOOLEAN);

INSERT INTO people (firstname, isalive) VALUES
    ('Sam', TRUE),
    ('Leslie', FALSE),
    ('Parker', FALSE);
Run Code Online (Sandbox Code Playgroud)

现在我想从表中删除死人。当我在 中执行此操作时psql,我看到一条消息,告诉我删除了多少行。

postgres=> DELETE FROM people WHERE isalive = FALSE;
DELETE 2
postgres=>
Run Code Online (Sandbox Code Playgroud)

但是,如果我将此 delete 语句放入函数并调用它,则不会看到相同的消息。

CREATE OR REPLACE FUNCTION deletedead() RETURNS void AS $$
  DELETE FROM people WHERE isalive = FALSE;
$$ LANGUAGE SQL;

SELECT deletedead();
Run Code Online (Sandbox Code Playgroud)

这会按预期删除行,但不会给出任何消息说明删除了多少行。我如何从这个函数中得到像“DELETE 2”这样的消息?

我尝试修改我的函数以返回删除的行数:

-- This doesn't work
CREATE OR REPLACE FUNCTION deletedead() RETURNS int AS $$
  DELETE FROM people WHERE isalive = FALSE RETURNING COUNT(*);
$$ LANGUAGE SQL;
Run Code Online (Sandbox Code Playgroud)

...但我收到一条错误消息 ERROR: aggregate functions are not allowed in RETURNING

Gor*_*off 6

错误信息是正确的。你应该能够做到:

CREATE OR REPLACE FUNCTION deletedead() RETURNS bigint AS $$
  WITH d as (
        DELETE FROM people WHERE isalive = FALSE RETURNING *
       )
  SELECT COUNT(*)
  FROM d;
$$ LANGUAGE SQL;
Run Code Online (Sandbox Code Playgroud)