规格约束
注意:
- 自治事务执行时,将会在后台启动自治事务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);
- CREATE OR REPLACE FUNCTION tri_insert_func() RETURNS TRIGGER AS
- $$
- DECLARE
- PRAGMA AUTONOMOUS_TRANSACTION;
- BEGIN
- INSERT INTO test_trigger_des_tbl VALUES(NEW.id1, NEW.id2, NEW.id3);
- RETURN NEW;
- END
- $$ LANGUAGE PLPGSQL; ```
- 自治事务不支持非顶层匿名块调用(仅支持顶层自治事务,包括存储过程、函数、匿名块)。
- 自治事务仅支持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);
-
- PROCEDURE OUT出参传递ref cursor(支持)
- CREATE OR REPLACE PROCEDURE proc_sys_ref(OUT c1 refcursor)
- IS
- declare
- PRAGMA AUTONOMOUS_TRANSACTION;
- BEGIN
-
OPEN c1 FOR SELECT section_ID FROM sections ORDER BY section_ID;
-
END;
-
/
-
CREATE OR REPLACE PROCEDURE proc_sys_call() AS
- DECLARE
- c1 SYS_REFCURSOR;
- TEMP NUMBER(4);
- BEGIN
- proc_sys_ref(c1);
- if c1%isopen then
- raise notice '%','ok';
-
end if;
-
LOOP
- FETCH C1 INTO TEMP;
- raise notice '%',C1%ROWCOUNT;
- EXIT WHEN C1%NOTFOUND;
- END LOOP;
- END;
-
/
-
- PROCEDURE IN或INOUT出参传递ref cursor(不支持)
- CREATE OR REPLACE PROCEDURE proc_sys_ref(IN c1 refcursor)
- IS
- declare
- PRAGMA AUTONOMOUS_TRANSACTION;
- BEGIN
- if c1%isopen then
- raise notice '%','ok';
-
end if;
-
LOOP
- FETCH C1 INTO TEMP;
- raise notice '%',C1%ROWCOUNT;
- EXIT WHEN C1%NOTFOUND;
- END LOOP;
- END;
-
/
-
CREATE OR REPLACE PROCEDURE proc_sys_call() AS
- DECLARE
- c1 SYS_REFCURSOR;
- TEMP NUMBER(4);
- BEGIN
- OPEN c1 FOR SELECT section_ID FROM sections ORDER BY section_ID;
- proc_sys_ref(c1);
- END;
-
/
-
- FUNCTION RETURN传递ref cursor(不支持)
- CREATE OR REPLACE function proc_sys_ref()
- return SYS_REFCURSOR
- IS
- declare
- PRAGMA AUTONOMOUS_TRANSACTION;
- C1 SYS_REFCURSOR;
- BEGIN
- OPEN C1 FOR SELECT section_ID FROM sections ORDER BY section_ID;
- return C1;
- END;
-
/
-
- FUNCTION OUT出参传递ref cursor(不支持)
- CREATE OR REPLACE function proc_sys_ref(C1 out SYS_REFCURSOR)
- return SYS_REFCURSOR
- IS
- declare
- PRAGMA AUTONOMOUS_TRANSACTION;
- BEGIN
- OPEN C1 FOR SELECT section_ID FROM sections ORDER BY section_ID;
- return 1;
- END;
- / ```
- 自治事务函数不支持返回非out形式的record类型。
- 不支持修改自治事务的隔离级别。
- 不支持自治事务返回集合类型(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. ;
注意: