存储过程支持自治事务

存储过程支持自治事务,标识符为PRAGMA AUTONOMOUS_TRANSACTION,执行的函数块中使用start transaction和commit/rollback包含执行的sql,其余语法与CREATE PROCEDURE创建存储过程类似,一个简单例子如下:

  1. --创建表。
  2. CREATE TABLE test1 (a int, b text);
  3. --创建包含自治事务的存储过程。
  4. CREATE OR REPLACE PROCEDURE autonomous_easy_1(i int)
  5. AS
  6. DECLARE
  7. PRAGMA AUTONOMOUS_TRANSACTION;
  8. BEGIN
  9. START TRANSACTION;
  10. INSERT INTO test1 VALUES (2, 'a');
  11. IF i % 2 = 0 THEN
  12. COMMIT;
  13. ELSE
  14. ROLLBACK;
  15. END IF;
  16. END;
  17. /
  18. --执行存储过程。
  19. select autonomous_easy_1(1);
  20. --查看表数据。
  21. select * from test1;
  22. --结果如下。
  23. a | b
  24. ---+---
  25. (0 rows)
  26. --执行存储过程。
  27. select autonomous_easy_1(2);
  28. --查看表数据。
  29. select * from test1;
  30. --结果如下。
  31. a | b
  32. ---+---
  33. 2 | a
  34. (1 row)
  35. --清空表数据。
  36. truncate table test1;
  37. --在回滚的事务块中执行包含自治事务的存储过程。
  38. begin;
  39. insert into test1 values(1,'b');
  40. select autonomous_easy_2(2);
  41. rollback;
  42. --查看表数据。
  43. select * from test1;
  44. --结果如下。
  45. a | b
  46. ---+---
  47. 2 | a
  48. (1 row)

上述例子,最后在回滚的事务块中执行包含自治事务的存储过程,也能直接说明了自治事务的特性,即主事务的回滚,不会影响自治事务已经提交的内容。