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

本文介绍了如何在PostgreSQL存储过程中模拟SAVEPOINT,由于PG不支持事务控制语句直接在存储过程中使用,作者通过BEGIN块进行模拟。详细探讨了在有EXCEPTION处理和无EXCEPTION处理时的不同情况,并提到了PG内部的子事务管理。最后,建议读者通过阅读源代码来学习和实现类似功能。
摘要由CSDN通过智能技术生成

有朋友问怎么实现存储过程(本篇特指函数)中的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、付费专栏及课程。

余额充值