PostgreSQL存储过程中的相同查询

ins*_*ity 0 sql postgresql select stored-procedures

所以,我正在尝试创建一个程序,它将在我的表中找到一个特定的行,将行保存在要返回的结果中,删除该行,然后返回结果.

我设法做的最好的事情是:

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;
Run Code Online (Sandbox Code Playgroud)

如你所见,我有2个SELECT操作几乎做同样的事情(额外的开销).有没有办法让第二个SELECT也设置,to_delete_id 所以我可以删除之后的行?

Ric*_*ton 6

你只想要一个DELETE ... RETURNING.

DELETE FROM my_table WHERE sth_id=foo LIMIT 1 RETURNING *
Run Code Online (Sandbox Code Playgroud)

根据ahwnn的评论编辑.非常正确 - 教我剪切+粘贴查询而不正确阅读.

DELETE FROM my_table WHERE id = (SELECT id ... LIMIT 1) RETURNING *
Run Code Online (Sandbox Code Playgroud)