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

时间:2012-04-23 06:41:11

标签: postgresql stored-procedures loops plpgsql

我需要编写一个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语句,尽管我可以看到循环正在运行。我将更新语句作为单个查询运行,它可以工作。我该如何解决这个问题?

由于

2 个答案:

答案 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可以在没有密码的情况下登录(默认情况下)。


或者查看pgAgent附带的pgAdmin