我有一个正在从 SQL Server 迁移的存储过程。目的是执行的时间不会超过指定的超时时间,但可能会花费大约 4 倍的时间。存储过程内的计算是轻量级的,不会花费太多时间。如果重要的话,数据库是 GCP Cloud SQL Postgres。超时机制有什么问题吗?
CREATE OR REPLACE FUNCTION spleasetasks(timeout_seconds INT,
poll_interval_millis INT
....)
RETURNS TABLE
(...)
AS
$$
DECLARE
timeout TIMESTAMPTZ := (CLOCK_TIMESTAMP() AT TIME ZONE 'UTC' + (timeout_seconds || ' seconds')::INTERVAL);
BEGIN
CREATE
TEMP TABLE result
(
....
) ON COMMIT DROP;
LOOP
IF timeout_seconds != 0 AND (CLOCK_TIMESTAMP() AT TIME ZONE 'UTC' > timeout) THEN
EXIT;
END IF;
....
IF
timeout_seconds = 0 OR
(CLOCK_TIMESTAMP() AT TIME ZONE 'UTC' + (poll_interval_millis || ' milliseconds')::INTERVAL) >=
timeout THEN
EXIT;
END IF;
....
EXECUTE PG_SLEEP(CAST(poll_interval_millis AS FLOAT) / 1000);
END LOOP;
RETURN QUERY SELECT * FROM result r;
END;
$$
LANGUAGE plpgsql;
EXECUTE PG_SLEEP(CAST(poll_interval_millis AS FLOAT) / 1000);
在 PL/pgSQL 中是废话,你应该使用
PERFORM
PERFORM PG_SLEEP(CAST(poll_interval_millis AS FLOAT) / 1000);
EXECUTE
应用于动态 SQL。