我正在使用PL/pgSQL函数“interpolate_values”进行一些耗时的计算。所谓“interpolation_jobs” A表包含有关每个函数调用监控信息,例如通过在PL/pgSQL函数中立即更新
SELECT status FROM interpolation_jobs WHERE id = job_id;
列“状态”中包含的一个值与给定的job_id函数调用的进程应该是可观察的“排队” ,'跑步'或'完成'。
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();
总之:没有。状态表的更新是事务的一部分,只有在事务提交后才能被其他进程看到。你需要异步通知来完成你想要的。请参阅精细手册中的'LISTEN'或'NOTIFY'。 – wildplasser 2013-04-29 10:51:51