window环境postgreSql自主事务使用(Autonomous Transaction)

参考1:Autonomous transaction support in PostgreSQL (dalibo.com)icon-default.png?t=LA92https://blog.dalibo.com/2016/08/19/Autonoumous_transactions_support_in_PostgreSQL.html

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

 

        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值