我需要编写一个plpgsql函数,它在无限循环中执行update语句:
create function change_type() returns void as $$
begin
loop
update table a set type = 1 where date < now();
end loop;
end;
$$ LANGUAGE plpgsql;
当我调用此函数时,不执行update语句,尽管我可以看到循环正在运行。我将更新语句作为单个查询运行,它可以工作。我该如何解决这个问题?
由于
答案 0 :(得分:4)
您遇到的问题是PostgreSQL中的存储过程会自动在其自己的事务中运行。所以更新是正在发生,它们只是在提交之后才可见 - 这是在存储过程退出时发生的(在这种情况下它永远不会发生)。
实际效果是,一旦活动事务变得太大,您的服务器最终将耗尽磁盘空间或内存,或两者(或其他一些内置安全限制)。
正如@JackManey建议的那样,解决方案是完全重新考虑你的策略。如果你可以解释你想要完成什么,我会打赌我的下一次付款检查,有更好的方法来实现它。
答案 1 :(得分:3)
我猜你要找的是 cronjob ,以便在特定时间(重复)安排任务。在UNIX / LINUX系统上尝试man crontab
。最好是系统用户 postgres 。
要每5分钟运行一次查询,请在cron表中输入如下所示的行。我在LINUX下使用crontab -e
来编辑我的cron作业:
* 5 * * * psql mydb -c 'UPDATE TABLE a SET type = 1 WHERE date < now()'
如果您有更复杂的作业,请使用多个SQL命令创建一个shell脚本,并将其命名为:
* 5 * * * psql mydb -f '/path/to/my_script.sh'
或者创建一个plpgsql函数并调用它:
* 5 * * * psql mydb -c 'SELECT myfunc()'
设置系统,以便超级用户postgres可以在没有密码的情况下登录(默认情况下)。