pg 事务 存储过程_PostgreSQL存储过程BEGIN块的事务处理

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

1、用BEGIN块模拟

随便建个表:CREATE TABLE a(col1 int);

存储过程如下:CREATE OR REPLACE FUNCTION ins_t() RETURNS void

AS $$

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.c

。static int

<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值