PL/pgSQL 循环不更新当前时间戳/now()
PL/pgSQL Loops don't update current timestamp / now()
我想看看在 postgres 的 DO 块中循环迭代需要多长时间。基本布局如下:
DO $$
declare v_time timestamptz;
declare i record;
begin
for i in select generate_series(1, 5) t
loop
select current_timestamp into v_time;
perform pg_sleep(i.t);
-- something done here (pg_sleep to ensure some time passes)
raise notice '%', v_time - (select current_timestamp);
-- expect negative interval from RAISE.
end loop;
end; $$;
但是,当我 运行 这个(已经在 Postgres 13 和 9 上试过)时,我返回了 0S 的间隔:
NOTICE: 00:00:00
NOTICE: 00:00:00
NOTICE: 00:00:00
NOTICE: 00:00:00
NOTICE: 00:00:00
DO
Query returned successfully in 15 secs 389 msec.
我以前做过这个,以前从未 运行 解决过这个问题,所以我想我的问题是“这次我做错了什么?”而不是“为什么 postgres 行为异常?”
current_timestamp
是 defined to be:
the start time of the current transaction, their values do not change during the transaction
您可能想使用 clock_timestamp()
而不是 returns 一个在事务中更改的值,请参阅上面的 link 以获得更完整的描述。
我想看看在 postgres 的 DO 块中循环迭代需要多长时间。基本布局如下:
DO $$
declare v_time timestamptz;
declare i record;
begin
for i in select generate_series(1, 5) t
loop
select current_timestamp into v_time;
perform pg_sleep(i.t);
-- something done here (pg_sleep to ensure some time passes)
raise notice '%', v_time - (select current_timestamp);
-- expect negative interval from RAISE.
end loop;
end; $$;
但是,当我 运行 这个(已经在 Postgres 13 和 9 上试过)时,我返回了 0S 的间隔:
NOTICE: 00:00:00
NOTICE: 00:00:00
NOTICE: 00:00:00
NOTICE: 00:00:00
NOTICE: 00:00:00
DO
Query returned successfully in 15 secs 389 msec.
我以前做过这个,以前从未 运行 解决过这个问题,所以我想我的问题是“这次我做错了什么?”而不是“为什么 postgres 行为异常?”
current_timestamp
是 defined to be:
the start time of the current transaction, their values do not change during the transaction
您可能想使用 clock_timestamp()
而不是 returns 一个在事务中更改的值,请参阅上面的 link 以获得更完整的描述。