postgresql case内部函数不';t触发器

postgresql case内部函数不';t触发器,postgresql,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; 当我作为常规select查询运行该命令时,它运行OK。但当我把它放在另一个函数中时(被调用的函数返回的更新表不超过5分钟),它

因此,我的数据库中有几个函数

当特定表中的数据超过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;
当我作为常规select查询运行该命令时,它运行OK。但当我把它放在另一个函数中时(被调用的函数返回的更新表不超过5分钟),它永远不会运行。另外,如果我只放置update_x(),那么它运行正常(但每次调用该函数时)

有人知道我该怎么解决这个问题吗? 一个想法是只设置一个cron,使其每5分钟独立运行一次函数,但我更希望服务器处于空闲状态,因为该函数占用大量资源,而且不会经常被调用

我使用的是8.4版(由于我的ISP,所以无法更改,尽管我正在考虑迁移到VPS,因此如果这是9.5及更高版本的版本,我可以等待)。

函数
now()
给出当前事务的开始时间,并且在其中保持不变。使用
clock\u 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

clock_timestamp()返回实际的当前时间,因此即使在单个SQL命令中,其值也会更改(…)

now()是一个传统的PostgreSQL,相当于事务\u timestamp()

函数
now()
给出当前事务的开始时间,并且在其中保持不变。使用
clock\u 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

clock_timestamp()返回实际的当前时间,因此即使在单个SQL命令中,其值也会更改(…)

now()是一个传统的PostgreSQL,相当于事务\u timestamp()


我不知道为什么,但一旦我把布尔值上移一级,它就开始工作了。 现在,我不再在函数内部执行case查询,而是向函数发送boolean,并在函数上方的视图中执行检查

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;

我不知道为什么,但一旦我把布尔值上移一级,它就开始工作了。 现在,我不再在函数内部执行case查询,而是向函数发送boolean,并在函数上方的视图中执行检查

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;

没有更多的上下文很难说,但值得注意的是,
now()
实际上并没有返回当前时间,而是返回当前事务的开始时间。如果这不是您想要的,请尝试使用
clock\u timestamp()
。有关详细信息,请参见。如果没有更多上下文,很难说,但值得注意的是,
now()
实际上并不返回当前时间,而是返回当前事务的开始时间。如果这不是您想要的,请尝试使用
clock\u timestamp()
。有关详细信息,请参阅。不起作用。我还是没有接到更新电话。和现在一样。如果我将命令作为常规查询运行,它会更新,如果我将其放入函数中,它不会更新。这是一个猜测游戏,没有两个函数的完整代码。您是否在
update\u x()
中使用
now()
?设法使其工作。我在多个地方使用now(),但update_x基本上会将新数据插入表中,检查表x中的数据是否超过5分钟。问题是,更新需要30秒,所以我不希望在5分钟内第一次查询时花费很长时间,然后在web应用程序内连续查询时不触发。不起作用。我还是没有接到更新电话。和现在一样。如果我将命令作为常规查询运行,它会更新,如果我将其放入函数中,它不会更新。这是一个猜测游戏,没有两个函数的完整代码。您是否在
update\u x()
中使用
now()
?设法使其工作。我在多个地方使用now(),但update_x基本上会将新数据插入表中,检查表x中的数据是否超过5分钟。问题是,更新需要30秒,所以我不希望在5分钟内第一次查询时花费很长时间,然后在web应用程序内连续查询时不触发。