这是我正在尝试做的一个非常简化的示例。考虑这张人表:
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
错误信息是正确的。你应该能够做到:
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)
| 归档时间: |
|
| 查看次数: |
4027 次 |
| 最近记录: |