PostgreSQL Oracle兼容性之plpgsql 自治事务(autonomous_transaction)补丁
作者: digoal
日期: 2016-11-16
背景
PostgreSQL的plpgsql服务端编程语言与Oracle数据库的pl/sql编程语言非常类似,但是对于自治事务一直没有语法层面的支持。
以往如果要支持自治事务,可以使用exception或者使用dblink来实现。
写法有点复杂,如果你想要语法层面的支持,可以试试社区放出的这个补丁,补丁还没有合并到主分支,不建议生产使用。
用法
以9.6为例,介绍一下这个补丁的用法。
安装补丁
$ wget https://www.postgresql.org/message-id/attachment/45863/autonomous.patch
$ cd postgresql-9.6.1
$ patch -p1 < ../autonomous.patch $ make && make install
重启数据库
$ pg_ctl restart -m fast
语法讲解
查看这两个回归测试的文件,可以了解它的用法
1. src/pl/plpgsql/src/expected/plpgsql_autonomous.out
CREATE TABLE test1 (a int);
CREATE FUNCTION autonomous_test() RETURNS integer
LANGUAGE plpgsql
AS $$
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
FOR i IN 0..9 LOOP
START TRANSACTION;
EXECUTE 'INSERT INTO test1 VALUES (' || i::text || ')';
IF i % 2 = 0 THEN
COMMIT;
ELSE
ROLLBACK;
END IF;
END LOOP;
RETURN 42;
END;
$$;
SELECT autonomous_test();
autonomous_test
-----------------
42
(1 row)
SELECT * FROM test1;
a
---
0
2
4
6
8
(5 rows)
TRUNCATE test1;
CREATE FUNCTION autonomous_test2() RETURNS integer
LANGUAGE plpgsql
AS $$
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
FOR i IN 0..9 LOOP
START TRANSACTION;
INSERT INTO test1 VALUES (i);
IF i % 2 = 0 THEN
COMMIT;
ELSE
ROLLBACK;