我正在使用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; $$;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。