云数据库 GaussDB-事务语句:限制场景

时间:2023-11-01 16:22:24

限制场景

  • 不支持调用的上下文环境:
    1. 不支持除了PLSQL的其他存储过程中调用COMMIT/ROLLBACK,例如PLJAVA、PLPYTHON等。
    2. 不支持函数中调用COMMIT/ROLLBACK,包括函数调用含有COMMIT/ROLLBACK的存储过程。
    3. 不支持事务块中调用了SAVEPOINT后,调用含有COMMIT/ROLLBACK的存储过程。
    4. 不支持TRIGGER中调用含有COMMIT/ROLLBACK的存储过程。
    5. 不支持EXECUTE语句中调用COMMIT/ROLLBACK语句。
    6. 不支持在CURSOR语句中打开一个含有COMMIT/ROLLBACK的存储过程。
    7. 不支持带有IMMUTABLE以及SHIPPABLE的存储过程调用COMMIT/ROLLBACK,或调用带有COMMIT/ROLLBACK语句的存储过程。
    8. 不支持SQL中调用含有COMMIT/ROLLBACK的存储过程,除了SELECT PROC以及CALL PROC。
    9. 存储过程头带有GUC参数设置的不允许调用COMMIT/ROLLBACK语句。
    10. 不支持CURSOR/EXECUTE语句,以及各类表达式内调用COMMIT/ROLLBACK。
    11. 不支持存储过程返回值与表达式计算。
  • 不支持提交回滚的内容:
    1. 不支持存储过程内声明变量以及传入变量的提交/回滚。
    2. 不支持存储过程内必须重启生效的GUC参数的提交/回滚。

在存储过程使用commit/rollback有以下限制场景:

函数(Function)中不允许调用commit/rollback语句,同时不允许函数调用含有commit/rollback的存储过程。

CREATE OR REPLACE FUNCTION FUNCTION_EXAMPLE1() RETURN INTASEXP INT;BEGIN    FOR i IN 0..20 LOOP        INSERT INTO EXAMPLE1(col1) VALUES (i);        IF i % 2 = 0 THEN            COMMIT;        ELSE            ROLLBACK;        END IF;    END LOOP;    SELECT COUNT(*) FROM EXAMPLE1 INTO EXP;    RETURN EXP;END;/

函数(Fucntion)中不允许调用带有commit/rollback语句的存储过程。

CREATE OR REPLACE FUNCTION FUNCTION_EXAMPLE2() RETURN INTASEXP INT;BEGIN    --transaction_example为存储过程,带有commit/rollback语句    CALL transaction_example();    SELECT COUNT(*) FROM EXAMPLE1 INTO EXP;    RETURN EXP;END;/

不允许Trigger的存储过程包含commit/rollback语句,或调用带有commit/rollback语句的存储过程。

CREATE OR REPLACE FUNCTION FUNCTION_TRI_EXAMPLE2() RETURN TRIGGERASEXP INT;BEGIN    FOR i IN 0..20 LOOP        INSERT INTO EXAMPLE1(col1) VALUES (i);        IF i % 2 = 0 THEN            COMMIT;        ELSE            ROLLBACK;        END IF;    END LOOP;    SELECT COUNT(*) FROM EXAMPLE1 INTO EXP;END;/CREATE TRIGGER TRIGGER_EXAMPLE AFTER DELETE ON EXAMPLE1 FOR EACH ROW EXECUTE PROCEDURE FUNCTION_TRI_EXAMPLE2();DELETE FROM EXAMPLE1;

不支持带有IMMUABLE以及SHIPPABLE的存储过程调用commit/rolblack,或调用带有commit/rollback语句的存储过程。

CREATE OR REPLACE PROCEDURE TRANSACTION_EXAMPLE1()IMMUTABLEASBEGIN    FOR i IN 0..20 LOOP        INSERT INTO EXAMPLE1 (col1) VALUES (i);        IF i % 2 = 0 THEN            COMMIT;        ELSE            ROLLBACK;        END IF;    END LOOP;END;/

不支持存储过程中任何变量的提交,包括存储过程内声明的变量或者传入的参数。

CREATE OR REPLACE PROCEDURE TRANSACTION_EXAMPLE2(EXP_OUT OUT INT)ASEXP INT;BEGIN    EXP_OUT := 0;    COMMIT;    DBE_OUTPUT.PRINT_LINE('EXP IS:'||EXP);    EXP_OUT := 1;    ROLLBACK;    DBE_OUTPUT.PRINT_LINE('EXP IS:'||EXP);END;/

不支持出现在SQL中的调用(除了Select Procedure)。

CREATE OR REPLACE PROCEDURE TRANSACTION_EXAMPLE3()ASBEGIN    FOR i IN 0..20 LOOP        INSERT INTO EXAMPLE1 (col1) VALUES (i);        IF i % 2 = 0 THEN            EXECUTE IMMEDIATE 'COMMIT';        ELSE            EXECUTE IMMEDIATE 'ROLLBACK';        END IF;    END LOOP;END;/

存储过程头带有GUC参数设置的不允许调用commit/rollback语句。

CREATE OR REPLACE PROCEDURE TRANSACTION_EXAMPLE4()SET ARRAY_NULLS TO "ON"ASBEGIN    FOR i IN 0..20 LOOP        INSERT INTO EXAMPLE1 (col1) VALUES (i);        IF i % 2 = 0 THEN            COMMIT;        ELSE            ROLLBACK;        END IF;    END LOOP;END;/

游标open的对象不允许为带有commit/rollback语句的存储过程。

CREATE OR REPLACE PROCEDURE TRANSACTION_EXAMPLE5(INTIN IN INT, INTOUT OUT INT)ASBEGININTOUT := INTIN + 1;COMMIT;END;/CREATE OR REPLACE PROCEDURE TRANSACTION_EXAMPLE6()ASCURSOR CURSOR1(EXPIN INT)IS SELECT TRANSACTION_EXAMPLE5(EXPIN);INTEXP INT;BEGIN    FOR i IN 0..20 LOOP        OPEN CURSOR1(i);        FETCH CURSOR1 INTO INTEXP;        INSERT INTO EXAMPLE1(COL1) VALUES (INTEXP);        IF i % 2 = 0 THEN            COMMIT;        ELSE            ROLLBACK;        END IF;        CLOSE CURSOR1;    END LOOP;END; /

不支持CURSOR/EXECUTE语句,以及各类表达式内调用COMMIT/ROLLBACK。

CREATE OR REPLACE PROCEDURE exec_func1()ASBEGIN    CREATE TABLE TEST_exec(A INT);COMMIT;END;/CREATE OR REPLACE PROCEDURE exec_func2()ASBEGINEXECUTE exec_func1();COMMIT;END;/

不支持存储过程返回值与表达式计算。

CREATE OR REPLACE PROCEDURE exec_func3(RET_NUM OUT INT)ASBEGIN    RET_NUM := 1+1;COMMIT;END;/CREATE OR REPLACE PROCEDURE exec_func4(ADD_NUM IN INT)ASSUM_NUM INT;BEGINSUM_NUM := ADD_NUM + exec_func3();COMMIT;END;/
support.huaweicloud.com/devg-opengauss/opengauss_devg_0693.html