Restrictions

Caution: When an autonomous transaction is executed, an autonomous transaction session is started in the background. You can use max_concurrent_autonomous_transactions to set the maximum number of concurrent autonomous transactions. The value range is 0 to 1024, and the default value is 10. When max_concurrent_autonomous_transactions is set to 0, autonomous transactions cannot be executed.

  • A trigger function does not support autonomous transactions.

    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;
    
  • Autonomous transactions cannot be invoked by non-top-layer anonymous blocks (but can only be invoked by top-layer autonomous transactions, including stored procedures, functions, and anonymous blocks).

    create table t1(a int ,b text);
    
    DECLARE 
    	--PRAGMA AUTONOMOUS_TRANSACTION;
    BEGIN
    	DECLARE 
    		PRAGMA AUTONOMOUS_TRANSACTION;
    	BEGIN
    		insert into t1 values(1,'can you rollback!');
    	END;
    	insert into t1 values(2,'I will rollback!');
    	rollback;
    END;
    /
    
    select * from t1;
    
  • Autonomous transactions do not support ref_cursor parameter transfer.

    create table sections(section_ID int);
    insert into sections values(1);
    insert into sections values(1);
    insert into sections values(1);
    insert into sections values(1);
    
    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;
    /
    
    CREATE OR REPLACE PROCEDURE proc_sys_call() AS 
    DECLARE
    	 C1 SYS_REFCURSOR;
    	 TEMP NUMBER(4);
    BEGIN
    	 c1 = proc_sys_ref();
    	 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;
    /
    
    select proc_sys_call();
    
    CREATE OR REPLACE function proc_sys_ref(OUT C2 SYS_REFCURSOR, OUT a int)
    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;
    /
    
    CREATE OR REPLACE PROCEDURE proc_sys_call() AS 
    DECLARE
    	 C1 SYS_REFCURSOR;
    	 TEMP NUMBER(4);
    	 a int;
    BEGIN
    	 OPEN C1 FOR SELECT section_ID FROM sections ORDER BY section_ID;
    	 c1 = proc_sys_ref(C1,a);
    	 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;
    /
    
    select proc_sys_call();
    
  • Autonomous transaction functions only return records in the out format.

  • The isolation level of an autonomous transaction cannot be changed.

  • Autonomous transactions do not support the setof return type.

Feedback
编组 3备份
    openGauss 2024-05-19 00:45:18
    cancel