存储过程支持自治事务
存储过程支持自治事务,标识符为PRAGMA AUTONOMOUS_TRANSACTION,执行的函数块中使用start transaction和commit/rollback包含执行的sql,其余语法与CREATE PROCEDURE创建存储过程类似,一个简单例子如下:
--创建表。
CREATE TABLE test1 (a int, b text);
--创建包含自治事务的存储过程。
CREATE OR REPLACE PROCEDURE autonomous_easy_1(i int)
AS
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
START TRANSACTION;
INSERT INTO test1 VALUES (2, 'a');
IF i % 2 = 0 THEN
COMMIT;
ELSE
ROLLBACK;
END IF;
END;
/
--执行存储过程。
select autonomous_easy_1(1);
--查看表数据。
select * from test1;
--结果如下。
a | b
---+---
(0 rows)
--执行存储过程。
select autonomous_easy_1(2);
--查看表数据。
select * from test1;
--结果如下。
a | b
---+---
2 | a
(1 row)
--清空表数据。
truncate table test1;
--在回滚的事务块中执行包含自治事务的存储过程。
begin;
insert into test1 values(1,'b');
select autonomous_easy_2(2);
rollback;
--查看表数据。
select * from test1;
--结果如下。
a | b
---+---
2 | a
(1 row)
上述例子,最后在回滚的事务块中执行包含自治事务的存储过程,也能直接说明了自治事务的特性,即主事务的回滚,不会影响自治事务已经提交的内容。