PostgreSQL存儲過程執行中對數據庫的更改不會提交到數據庫。咱們想要了解存儲過程執行的狀態能夠用RAISE語句。 RAISE語句能夠輸出存儲過程運行中的消息或者錯誤。 用法以下: www.postgresql.org/docs/curren…javascript
RAISE [ level ] 'format' [, expression [, ... ]] [ USING option = expression [, ... ] ];
RAISE [ level ] condition_name [ USING option = expression [, ... ] ];
RAISE [ level ] SQLSTATE 'sqlstate' [ USING option = expression [, ... ] ];
RAISE [ level ] USING option = expression [, ... ];
RAISE ;
複製代碼
這個比較簡單,咱們只須要在程序外部捕獲sql返回的 消息並更新到數據庫中便可html
node中的實現java
const pool = new Pg.Pool(Config.db);
pool.on('connect', (cl) => {
cl.on('notice', (msg)=> {
//獲取sql拋出的信息
<!--此處能夠執行更新進度等操做-->
});
});
複製代碼
關閉正在運行中的存儲過程,咱們須要用到兩個函數。node
pg_backend_pid
: 查詢當前會話的服務器進程的進程ID,pg_cancel_backend(pid int)
: 取消後端的當前查詢。若是調用角色是其後端被取消或已授予調用角色的角色的成員,則也容許這樣作pg_signal_backend,可是隻有超級用戶能夠取消超級用戶後端。create or replace function pg_cancel_backend()
returns void
as $$
declare
backend_pid bigint;
begin
--查詢當前pid
backend_pid = pg_backend_pid();
loop
raise notice '%', format('%1$s : backend_pid: %2$s', now(),backend_pid);
perform pg_sleep(2);
end loop;
end;
$$ language plpgsql;
-- 2019-07-25 03:47:30.783608+00 : backend_pid: 13677
複製代碼
select pg_cancel_backend(13677);
複製代碼