循环中的Postgresql plpgsql存储过程更新语句

标签 postgresql stored-procedures loops plpgsql

我需要编写一个在无限循环中执行更新语句的 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/

相关文章:

c# - 使用 C# 将 PDF 作为字节数组插入 SQL Server 存储过程

Postgresql:在给定子字符串之前提取数字

Perl - 连接到 PostgreSQL 数据库 - 找不到合适的套接字

sql - 对于某些 groupid 列的每个唯一值,如何获取具有最后 3 个日期的行?

R:重复脚本 n 次,在每次迭代中更改变量

java - 如何使用 Velocity 模板语言检查数组中是否存在值

c++ - 如何遍历类 C++ 的变量成员

sql - PostgreSQL 数据库 - 仅在记录不存在时插入

MySQL 错误 1172 - 结果由多行组成

Mysql存储过程: match the column rule to retrieve value