PostgreSQL存储过程执行中对数据库的更改不会提交到数据库。我们想要了解存储过程执行的状态可以用RAISE语句。 RAISE语句可以输出存储过程运行中的消息或者错误。 用法如下: www.postgresql.org/docs/curren…
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 ;
更新存储过程的进度
我们只需要在程序外部捕获raise的消息并更新到数据库中即可
node中的实现
const pool = new Pg.Pool(Config.db);
pool.on('connect', (cl) => {
cl.on('notice', (msg)=> {
//获取sql抛出的信息
<!--此处可以执行更新进度等操作-->
});
});
关闭正在运行中的存储过程
关闭正在运行中的存储过程,我们需要用到两个函数。
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);