【问题标题】:How to check if deletion was successful in PostgreSQL function?如何在 PostgreSQL 函数中检查删除是否成功?
【发布时间】:2015-08-13 06:16:11
【问题描述】:

我有一个PostgreSQL 函数,它可以从表中删除行。 可能存在我要删除的行已被其他人删除的情况。在这种情况下,我想中止该功能并回滚它所做的一切。

manual 没有说明我如何知道DELETE 语句是否返回而不进行任何删除。

我写了这个函数:

CREATE OR REPLACE FUNCTION func1()
  RETURNS integer AS
$BODY$
declare 
    line record;
    errorint int;
for line in select * from tab  where ...
LOOP
        DELETE from x WHERE...
        if 0 row deleted then:
            errorint =1;
            raise exception 'delete error';
end loop;               
return 0;           
exception
        when raise_exception then
            return errorint;
end;                
$BODY$
  LANGUAGE plpgsql VOLATILE

DELETE 语句将仅删除 1 或 0 行WHERE 只给出一行。这意味着成功是指"Query returned successfully: 1 rows affected",失败是指"Query returned successfully: 0 rows affected"。我只是不知道如何检查它返回的内容。如果有其他方法来检查它也是可以接受的。

基本上我的问题是如何将if 0 row deleted then 转换为PostgreSQL 语法。

【问题讨论】:

  • 您可以使用raise notice进行验证
  • 这将如何解决我的问题?我需要知道 DELETE 何时不影响任何行。 raise notice 对此有何帮助?
  • 这应该可以解决我的问题...但它提出了另一个问题。第一个GET DIAGNOSTICS only useful after an INSERT command 无关。第二个GET DIAGNOSTICS 只能区分0行到多行。不能说多少。它给出正确或错误的答案。第三,不提供任何信息。真的没有办法知道影响了多少行吗?它不会进行任何降神。当查询完成时,此信息会打印到控制台中。

标签: sql postgresql


【解决方案1】:

您想要做的是mutual exclusion,我认为您必须寻找表/行锁定。但是,如果您想要一个快速的答案,告诉您删除了多少行,请查看this answer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-02
    • 1970-01-01
    • 2013-03-12
    • 2019-01-09
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    相关资源
    最近更新 更多