如果存储过程在执行过程中失败,则不执行删除存储过程

Drop in stored procedure not executed if stored procedure failed in middle of execution

我有一个存储过程 create_mv()。查询基本上是这样的

create procedure create_mv()
    language plpgsql
as
$$
begin
drop my_mv1();
drop my_mv2();
drop my_mv3();

create materialized view my_mv1 as...;
create materialized view my_mv2 as...;
create materialized view my_mv3 as...;
end;
$$;

my_mv1、my_mv2 和 my_mv3 占用大量磁盘空间 space,所以我想在再次创建它们之前先删除它们。但是创建my_mv2时存储过程执行失败,因为磁盘space已满。

然后我检查了一下,发现my_mv1、my_mv2和my_mv3还在。为什么不掉? 我是否以错误的方式使用存储过程?

感谢您的帮助。

当出现异常时,事务无法提交,最终只能回滚。

您可以尝试通过将每个语句包含在一个块中来捕获任何异常:

...
BEGIN
  DROP ...;
EXCEPTION WHEN OTHERS THEN
END;
...
BEGIN
  CREATE ...;
EXCEPTION WHEN OTHERS THEN
END;
...

这样就不会出现异常。

但是单个语句仍然会失败。所以最后你不会真正知道哪些语句成功执行,哪些语句失败,从而使数据库处于可能不一致的状态。因此,如果我在你那里,我会重新考虑将所有这些放在一个(单个)程序中(或考虑购买更大的磁盘)的整个概念。