参考2:build bg_background.dll file
最近做项目需要在存储过程中使用类似Oracle的自主事务(PRAGMA AUTONOMOUS_TRANSACTION),但是发现在postgreSql中并没有这样的方法,查阅资料发现可以使用db_link (比较麻烦)和bg_ground_XXXX方法,后续查阅了参考1资料最终决定使用bg_ground;
由于没有现成的插件脚本, 参考资料从git上面下载了它的使用教程(和C++代码),这个资料是通过Visual Studio工具(建议使用2021版本,本人使用2017 没有成功的生成)去生成一个pg_background.dll文件才可以在对应的postreSql 的版本中使用,注意不同的postgresql版本的dll文件无法兼容,所以最好自己去生成;
参考2是通过git下载下来的文件,子目录下的.dll文件是通过postgresql-12.8-2生成的如果是12.8可以直接用;build 相关配置
生成文件之后操作步骤:
1.将*.dll文件放入F:\PostgreSQL\12\lib
2.将 *.control 和 *.sql 放入 F:\PostgreSQL\12\share\extension
3.命令进入 testsmbc database psql -p 端口-U user -d dbname
eg:psql -p 5432 -U postgres -d testdb
--select * from pg_available_extensions; 查询可安装插件
4.create extension;(不指定schema ,权限会给public)
-- alter extension pg_background set schema pg_catalog; 指定schema
create extension pg_background ;
4.给指定user EXECUTE权限 (不给权限,该user调用不了,删除该user时必须先收回权限才能删除)
GRANT all ON FUNCTION public.pg_background_launch(text,int4) TO XXX;
GRANT all ON FUNCTION public.pg_background_result(int4) TO XXX;
GRANT all ON FUNCTION public.pg_background_detach(int4) TO XXX;
我遇到的坑:
1.select pg_background_launch(‘XXXXXX’);这个语法可以直接在dbeaver中执行,返回一个进程id,‘XXXXXX’也会执行,但是在存储过程中必须这样用,否则不会执行改语句
perform * from pg_background_result(pg_background_launch('DML SQL')) as p (ret XXXX);
2.select * from pg_background_result(int4 ) as p (ret XXXX);
这个方法我发现比较傻, 规定了必须有返回值,规定了 执行的语句中必须有返回值,如果没有返回值 as p (ret void)是不支持的
解决这个问题 的一个方法就是,在调用无返回值的存储过程或者方法时 使用select true from XXXX
eg:
v_sql := 'select true from function1()';
PERFORM * FROM pg_background_result(pg_background_launch(v_sql)) AS p (ret boolean);