巧用raise語句

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,可是隻有超級用戶能夠取消超級用戶後端。

準備一個長時間執行的sql

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
複製代碼

根據backend_pid關閉存儲過程

select pg_cancel_backend(13677);
複製代碼
相關文章
相關標籤/搜索