微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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中更新值,以便在函数调用返回之前可以访问新值?

谢谢!

编辑:

感谢您的所有答案,这些答案帮助我理解了异步数据库操作的一般问题. 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 举报,一经查实,本站将立刻删除。

相关推荐