加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读