规格约束

规格约束 - 图1 注意:

  • 自治事务执行时,将会在后台启动自治事务session,我们可以通过max_concurrent_autonomous_transactions设置自治事务执行的最大并行数量,该参数取值范围为0~1024,默认值为10。
  • 当max_concurrent_autonomous_transactions参数设置为0时,自治事务将无法执行。
  • 自治事务新启session后,将使用默认session参数,不共享主session下对象(包括session级别变量,本地临时变量,全局临时表的数据等)。
  • 触发器函数不支持自治事务。

``` 1. CREATE TABLE test_trigger_des_tbl(id1 INT, id2 INT, id3 INT);

  1. CREATE OR REPLACE FUNCTION tri_insert_func() RETURNS TRIGGER AS
  2. $$
  3. DECLARE
  4. PRAGMA AUTONOMOUS_TRANSACTION;
  5. BEGIN
  6. INSERT INTO test_trigger_des_tbl VALUES(NEW.id1, NEW.id2, NEW.id3);
  7. RETURN NEW;
  8. END
  9. $$ LANGUAGE PLPGSQL; ```
  10. 自治事务不支持非顶层匿名块调用(仅支持顶层自治事务,包括存储过程、函数、匿名块)。
  11. 自治事务仅支持PROCEDURE OUT参数传递ref cursor参数,不支持IN、INOUT以及FUNCTION传递ref cursor参数。

``` 1. create table sections(section_ID int); 2. insert into sections values(1); 3. insert into sections values(1); 4. insert into sections values(1); 5. insert into sections values(1);

    1. PROCEDURE OUT出参传递ref cursor(支持)
  1. CREATE OR REPLACE PROCEDURE proc_sys_ref(OUT c1 refcursor)
  2. IS
  3. declare
  4. PRAGMA AUTONOMOUS_TRANSACTION;
  5. BEGIN
  6. OPEN c1 FOR SELECT section_ID FROM sections ORDER BY section_ID;

  7. END;

  8. /

  9. CREATE OR REPLACE PROCEDURE proc_sys_call() AS

  10. DECLARE
  11. c1 SYS_REFCURSOR;
  12. TEMP NUMBER(4);
  13. BEGIN
  14. proc_sys_ref(c1);
  15. if c1%isopen then
  16. raise notice '%','ok';
  17. end if;

  18. LOOP

  19. FETCH C1 INTO TEMP;
  20. raise notice '%',C1%ROWCOUNT;
  21. EXIT WHEN C1%NOTFOUND;
  22. END LOOP;
  23. END;
  24. /

    1. PROCEDURE IN或INOUT出参传递ref cursor(不支持)
  25. CREATE OR REPLACE PROCEDURE proc_sys_ref(IN c1 refcursor)
  26. IS
  27. declare
  28. PRAGMA AUTONOMOUS_TRANSACTION;
  29. BEGIN
  30. if c1%isopen then
  31. raise notice '%','ok';
  32. end if;

  33. LOOP

  34. FETCH C1 INTO TEMP;
  35. raise notice '%',C1%ROWCOUNT;
  36. EXIT WHEN C1%NOTFOUND;
  37. END LOOP;
  38. END;
  39. /

  40. CREATE OR REPLACE PROCEDURE proc_sys_call() AS

  41. DECLARE
  42. c1 SYS_REFCURSOR;
  43. TEMP NUMBER(4);
  44. BEGIN
  45. OPEN c1 FOR SELECT section_ID FROM sections ORDER BY section_ID;
  46. proc_sys_ref(c1);
  47. END;
  48. /

    1. FUNCTION RETURN传递ref cursor(不支持)
  49. CREATE OR REPLACE function proc_sys_ref()
  50. return SYS_REFCURSOR
  51. IS
  52. declare
  53. PRAGMA AUTONOMOUS_TRANSACTION;
  54. C1 SYS_REFCURSOR;
  55. BEGIN
  56. OPEN C1 FOR SELECT section_ID FROM sections ORDER BY section_ID;
  57. return C1;
  58. END;
  59. /

    1. FUNCTION OUT出参传递ref cursor(不支持)
  60. CREATE OR REPLACE function proc_sys_ref(C1 out SYS_REFCURSOR)
  61. return SYS_REFCURSOR
  62. IS
  63. declare
  64. PRAGMA AUTONOMOUS_TRANSACTION;
  65. BEGIN
  66. OPEN C1 FOR SELECT section_ID FROM sections ORDER BY section_ID;
  67. return 1;
  68. END;
  69. / ```
  70. 自治事务函数不支持返回非out形式的record类型。
  71. 不支持修改自治事务的隔离级别。
  72. 不支持自治事务返回集合类型(setof)。

1. create table test_in (id int,a date); 2. create table test_main (id int,a date); 3. insert into test_main values (1111,'2021-01-01'),(2222,'2021-02-02'); 4. truncate test_in,test_main; 5. CREATE OR REPLACE FUNCTION autonomous_f_022(num1 int) RETURNS SETOF test_in 6. LANGUAGE plpgsql AS $$ 7. DECLARE 8. count int :=3; 9. test_row test_in%ROWTYPE; 10. PRAGMA AUTONOMOUS_TRANSACTION; 11. BEGIN 12. while true 13. loop 14. if count=3 then 15. null; 16. else 17. if count=2 then 18. insert into test_main values (count,'2021-03-03'); 19. goto pos1; 20. end if; 21. end if; 22. count=count-1; 23. end loop; 24. insert into test_main values (1000,'2021-04-04'); 25. <<pos1>> 26. for test_row in select * from test_main 27. loop 28. return next test_row; 29. end loop; 30. return; 31. END; 32. $$ 33. ;