我有一个存储过程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占用大量磁盘空间,因此我想先删除它们,然后再创建它们。但是由于磁盘空间已满,在创建my_mv2时存储过程无法执行。
然后我进行检查,发现my_mv1,my_mv2和my_mv3仍然存在。为什么不掉线? 我是否以错误的方式使用存储过程?
感谢您的帮助。
答案 0 :(得分:1)
如果有异常,则无法提交事务,因此最终必须回滚更改。
您可以通过将每个语句括在一个块中来尝试捕获任何异常:
...
BEGIN
DROP ...;
EXCEPTION WHEN OTHERS THEN
END;
...
BEGIN
CREATE ...;
EXCEPTION WHEN OTHERS THEN
END;
...
这样,异常不会冒出来。
但是,单个语句仍然可能失败。因此,最后您将不会真正知道成功执行了哪些语句以及哪些语句使数据库处于可能不一致的状态。因此,如果我在您那里,我会重新考虑将所有内容放入(单个)过程中的整个概念(或考虑购买更大的磁盘)。