pg中为存储过程添加进度
有时我们可能需要知道长时间调用存储过程的进度。
通过外部表
首先我想到通过修改一张外部表更新存储过程的进度,后来发现这样是不行的。存储过程执行中对数据库的改变在外部是获取不到的,它只有在执行完毕提交后,我们才能获取结果,所以这种方式我们获取到的进度可能全都是 100%。
raise
RAISE
语句可以在 sql 运行过程中向程序抛出消息或错误,文档
用法如下所示: sql
RAISE INFO 'model_progress:%',json_build_object('job_uid',job_uid,'job_progress',progress);
程序中我们还可以获取到存储过程抛出的消息:如 node 实现所示
const pool = new Pg.Pool(Config.db);
pool.on("connect", (cl) => {
cl.on("notice", (msg) => {
//获取sql抛出的信息
DbNoticeHandler.handle(msg);
});
});