所以,我正在尝试创建一个可以找到的程序 在我的表中的特定行,保存结果中的行 返回,删除该行,然后返回结果。
我设法做的最好的事情是:
CREATE OR REPLACE FUNCTION sth(foo integer)
RETURNS TABLE(a integer, b integer, ... other fields) AS $$
DECLARE
to_delete_id integer;
BEGIN
SELECT id INTO to_delete_id FROM my_table WHERE sth_id = foo LIMIT 1;
RETURN QUERY SELECT * FROM my_table WHERE sth_id = foo LIMIT 1;
DELETE FROM my_table where id = to_delete_id;
END;
$$ LANGUAGE plpgsql;
如您所见,我有两个SELECT
操作,几乎可以做同样的事情(额外的
高架)。有没有办法让第二个SELECT
并设置to_delete_id
所以我可以在之后删除该行吗?
答案 0 :(得分:6)
你只想要一个DELETE...RETURNING。
DELETE FROM my_table WHERE sth_id=foo LIMIT 1 RETURNING *
根据ahwnn的评论进行编辑。非常正确 - 教我剪切+粘贴查询而不正确阅读。
DELETE FROM my_table WHERE id = (SELECT id ... LIMIT 1) RETURNING *
答案 1 :(得分:1)
可以更轻松地完成:
CREATE OR REPLACE FUNCTION sth(foo integer)
RETURNS SETOF my_table
AS
$$
BEGIN
return query
DELETE FROM my_table p
where sth_id = foo
returning *;
END;
$$
LANGUAGE plpgsql;
答案 2 :(得分:0)
将所有列选择为变量,返回它们,然后使用id:
删除为每列声明一个变量(通过约定命名为save作为列,但带有前导下划线),然后:
SELECT id, col1, col2, ...
INTO _id, _col1, _col22, ...
FROM my_table
WHERE sth_id = foo
LIMIT 1;
RETURN QUERY SELECT _id, _col1, _col22, ...;
DELETE FROM my_table where id = _id;