如果存储过程在执行过程中失败,则不执行删除存储过程
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;
...
这样就不会出现异常。
但是单个语句仍然会失败。所以最后你不会真正知道哪些语句成功执行,哪些语句失败,从而使数据库处于可能不一致的状态。因此,如果我在你那里,我会重新考虑将所有这些放在一个(单个)程序中(或考虑购买更大的磁盘)的整个概念。
我有一个存储过程 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;
...
这样就不会出现异常。
但是单个语句仍然会失败。所以最后你不会真正知道哪些语句成功执行,哪些语句失败,从而使数据库处于可能不一致的状态。因此,如果我在你那里,我会重新考虑将所有这些放在一个(单个)程序中(或考虑购买更大的磁盘)的整个概念。