巧用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);
复制代码
相关文章
相关标签/搜索