postgresql – PL / pgSQL函数中的立即更新
发布时间:2020-12-13 15:50:24 所属栏目:百科 来源:网络整理
导读:我正在使用PL / pgSQL函数“interpolate_values”进行一些耗时的计算.名为“interpolation_jobs”的表包含有关每个函数调用的监视信息,因此具有给定job_id的函数调用的进度应该可以通过 SELECT status FROM interpolation_jobs WHERE id = job_id; 列“statu
我正在使用PL / pgSQL函数“interpolate_values”进行一些耗时的计算.名为“interpolation_jobs”的表包含有关每个函数调用的监视信息,因此具有给定job_id的函数调用的进度应该可以通过
SELECT status FROM interpolation_jobs WHERE id = job_id; 列“status”包含其中一个值’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(); 解决方法
您可以使用
dblink连接到您的数据库并执行将被立即提交的查询:
CREATE OR REPLACE FUNCTION interpolate_values (_job_id INTEGER) RETURNS VOID LANGUAGE plpgsql VOLATILE AS $$ DECLARE _conn TEXT; _status TEXT; BEGIN _conn:='hostaddr=127.0.0.1 port=5433 dbname=<db> user=<user> password=<pass>'; _status='running'; PERFORM dblink_exec(_conn,'UPDATE interpolation_jobs SET status = '''||_status||''',progress = 0.0 WHERE id ='||_job_id); PERFORM pg_sleep(10); --simulate some time consuming calculations _status='finished'; PERFORM dblink_exec(_conn,progress = 100.0 WHERE id ='||_job_id); END; $$; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |