我正在使用一些耗时的计算来处理 PL/pgSQL 函数“interpolate_values”。名为“interpolation_jobs”的表包含有关每个函数调用的监视信息,因此具有给定 job_id 的函数调用的进度应该可以通过以下方式观察到
SELECT status FROM interpolation_jobs WHERE id = job_id;
“状态”列包含值“排队”、“运行”或“完成”之一。在函数开始时,状态从 'queued' 变为 'running',最后设置为 'done':
CREATE OR REPLACE FUNCTION interpolate_values (job_id INTEGER)
RETURNS VOID
LANGUAGE plpgsql VOLATILE
AS $$
DECLARE
BEGIN
EXECUTE 'UPDATE interpolation_jobs
SET status = ''running'', progress = 0.0
WHERE id = ' || job_id || ';';
--
-- ... some extensive database computations ...
--
EXECUTE 'UPDATE interpolation_jobs
SET status = ''done''
WHERE id = ' || job_id || ';';
END;
$$;
我的问题是在函数调用期间状态没有更新。更新实际上发生在函数调用返回时。因此,状态直接从“排队”变为“完成”。线条
EXECUTE 'UPDATE interpolation_jobs
SET status = ''running'', progress = 0.0
WHERE id = ' || job_id || ';';
没有效果。
是否有可能立即更新 PL/pgSQL 中的值,以便在函数调用返回之前可以访问新值?
谢谢!
编辑:
感谢您的所有回答,这对我了解异步数据库操作的一般问题有很大帮助。dblink 方法对我有用。如果使用相同的数据库,则无需指定 IP/端口/用户:
SELECT * FROM current_database() INTO _db_name;
PERFORM dblink_connect('dbname=' || _db_name);
PERFORM dblink_exec('UPDATE interpolation_jobs SET status = ''running'' WHERE id =' || _job_id);
--
-- ... some extensive database computations ...
--
PERFORM dblink_exec('UPDATE interpolation_jobs SET status = ''done'' WHERE id =' || _job_id);
PERFORM dblink_disconnect();