存储过程for循环加事务_PostgreSQL存储过程BEGIN块的事务处理

在PostgreSQL中,存储过程不支持直接使用SAVEPOINT,但可以通过BEGIN块模拟事务处理。文章介绍了如何利用BEGIN块、PL/pgSQL以及PG_TRY和PG_CATCH来实现类似SAVEPOINT的功能,探讨了在没有EXCEPTION处理时的情况,并强调了阅读源代码在理解PG功能中的重要性。
摘要由CSDN通过智能技术生成

有朋友问怎么实现存储过程(本篇特指函数)中的SAVEPOINT,直接调用是不可以的,因为PG不允许事务控制语句出现在存储过程中,但我们还是有办法做到一定程度的模拟。

1、用BEGIN块模拟

随便建个表:

CREATE TABLE a(col1 int);

存储过程如下:

CREATE OR REPLACE FUNCTION ins_t() RETURNS voidAS $$BEGIN  INSERT INTO a VALUES(100);  BEGIN    INSERT INTO a VALUES(200);    RAISE 'any error';  EXCEPTION    WHEN others THEN      null;  END;END;$$ LANGUAGE plpgsql;

测试:

flying=# SELECT ins_t();                                                                                  ins_t-------(1 row)flying=# SELECT * FROM a; col1------  100(1 row)

可以看到,内嵌BEGIN块中的INSERT操作并没有生效。


2、PL/pgSQL如何实现

块定义在pl_gram.y中,有兴趣可以自己去看,块的执行代码位于 src/pl/plpgsql/src/pl_exec.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值