postgresql – PL / pgSQL函数中的立即更新

前端之家收集整理的这篇文章主要介绍了postgresql – PL / pgSQL函数中的立即更新前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用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中更新值,以便在函数调用返回之前可以访问新值?

谢谢!

编辑:

感谢您的所有答案,这些答案帮助我理解了异步@R_301_457@操作的一般问题. dblink方法适合我.如果使用相同的@R_301_457@,则无需指定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连接到您的@R_301_457@并执行将被立即提交的查询

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;
$$;

猜你在找的Postgre SQL相关文章