postgresql case里面的函数不会触发

时间:2017-12-06 08:54:39

标签: postgresql

所以,我的数据库中有几个函数。

当特定表中的数据超过5分钟时,需要运行一个函数。

我尝试过这样做:

PERFORM case when now() - '5 minutes'::interval > (select end_time from x order by end_route desc limit 1) then update_x() else null end;

当我将命令作为常规选择查询运行时,它运行正常。但当我把它放在另一个函数(被调用的那个,返回不超过5分钟的更新表)时,它永远不会运行。另外,如果我只是放入update_x(),那么它运行正常(但每次调用该函数时)。

有没有人知道如何解决这个问题? 一个想法是设置一个cron来独立运行该函数每5分钟,但我宁愿服务器处于空闲状态,因为该功能非常耗费资源,并且不会经常调用它。

我在版本8.4(由于我的ISP,因此无法更改,但我正在考虑转移到VPS,所以如果这是适用于9.5及更新的东西,我可以等待。)

2 个答案:

答案 0 :(得分:2)

函数now()给出了当前事务的开始时间,并且在其中是不变的。使用clock_timestamp(),示例:

do $$
begin
    for i in 1..3 loop
        perform pg_sleep(1);
        raise notice 'now(): % clock_timestamp(): %', now(), clock_timestamp();
    end loop;
end $$;

NOTICE:  now(): 2017-12-06 10:22:40.422683+01 clock_timestamp(): 2017-12-06 10:22:41.437099+01
NOTICE:  now(): 2017-12-06 10:22:40.422683+01 clock_timestamp(): 2017-12-06 10:22:42.452456+01
NOTICE:  now(): 2017-12-06 10:22:40.422683+01 clock_timestamp(): 2017-12-06 10:22:43.468124+01

the documentation:

  

clock_timestamp()返回实际的当前时间,因此即使在单个SQL命令(...)中它的值也会发生变化

     

now()是一个等同于transaction_timestamp()的传统PostgreSQL。

答案 1 :(得分:0)

我不知道为什么,但是一旦我将布尔值向上移动一级,它就开始工作了。 所以现在不是在函数内部执行大小写查询,而是向函数发送布尔值,并在该函数上方的视图中执行检查。

CREATE VIEW x_view AS select * from get_x((clock_timestamp() - '5 minutes'::interval)::timestamp > (select end_route from gps_skole2 order by end_route desc limit 1));

在函数内部:

PERFORM case when $1 then update_x() else null end;