PostgreSQL存储过程中的相同查询

时间:2013-10-04 10:51:47

标签: 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;

如您所见,我有两个SELECT操作,几乎可以做同样的事情(额外的 高架)。有没有办法让第二个SELECT并设置to_delete_id 所以我可以在之后删除该行吗?

3 个答案:

答案 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;