巧用SQL raise语句

936 阅读1分钟

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