我需要编写一个在无限循环中执行更新语句的 plpgsql 函数:
create function change_type() returns void as $$
begin
loop
update table a set type = 1 where date < now();
end loop;
end;
$$ LANGUAGE plpgsql;
当我调用这个函数时,更新语句没有被执行,尽管我可以看到循环正在运行。我将更新语句作为单个查询运行并且它有效。我该如何解决这个问题?
谢谢
最佳答案
您遇到的问题是 PostgreSQL 中的存储过程自动在其自己的事务中运行。所以更新正在发生,它们只是在提交之前不可见——这发生在存储过程退出时(在这种情况下它永远不会这样做)。
这将产生的实际影响是,一旦事件事务变得太大,您的服务器最终将耗尽磁盘空间或内存,或两者(或其他一些内置安全限制)。
正如@JackManey 所建议的那样,解决方案是彻底重新考虑您的策略。如果你能解释你想要完成的事情,我敢打赌我的下一张支票,有更好的方法来完成它。
关于循环中的Postgresql plpgsql存储过程更新语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10275904/