我正在使用PL/pgSQL函數「interpolate_values」進行一些耗時的計算。所謂「interpolation_jobs」 A表包含有關每個函數調用監控信息,例如通過在PL/pgSQL函數中立即更新
SELECT status FROM interpolation_jobs WHERE id = job_id;
列「狀態」中包含的一個值與給定的job_id函數調用的進程應該是可觀察的「排隊」 ,'跑步'或'完成'。
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();
總之:沒有。狀態表的更新是事務的一部分,只有在事務提交後才能被其他進程看到。你需要異步通知來完成你想要的。請參閱精細手冊中的'LISTEN'或'NOTIFY'。 – wildplasser 2013-04-29 10:51:51