【问题标题】:Same queries in PostgreSQL stored procedurePostgreSQL 存储过程中的相同查询
【发布时间】:2013-10-04 10:51:46
【问题描述】:

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

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

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;

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

【问题讨论】:

    标签: sql postgresql select stored-procedures


    【解决方案1】:

    你只想要一个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 *
    

    【讨论】:

    • DELETE 不支持LIMIT
    • 第二个解决方案似乎与 2 SELECT's 差不多,因为您首先选择了 id,然后搜索以删除具有此 id 的表。我只想SELECT并立即删除。
    • 但除非我误解了你的例子,否则你不会试图删除所有匹配项,只是一个(随机)
    • 理查德......不是真的。我忘了在我的代码上添加一个“ORDER BY”,所以我想在订购后只删除第一个元素
    • 无论如何,接受您的解决方案是最接近我所寻找的解决方案。
    【解决方案2】:

    可以更轻松地完成:

    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;
    

    【讨论】:

      【解决方案3】:

      将所有列选择成变量,返回,然后使用id删除:

      为每一列声明一个变量(按约定命名为保存为列但带有前导下划线),然后:

      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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-21
        • 1970-01-01
        • 2018-06-17
        • 1970-01-01
        • 2021-08-18
        • 1970-01-01
        • 2013-02-02
        • 1970-01-01
        相关资源
        最近更新 更多