云数据库 GaussDB-事务语句:限制场景
限制场景
- 不支持调用的上下文环境:
- 不支持除了PLSQL的其他存储过程中调用COMMIT/ROLLBACK,例如PLJAVA、PLPYTHON等。
- 不支持函数中调用COMMIT/ROLLBACK,包括函数调用含有COMMIT/ROLLBACK的存储过程。
- 不支持事务块中调用了SAVEPOINT后,调用含有COMMIT/ROLLBACK的存储过程。
- 不支持TRIGGER中调用含有COMMIT/ROLLBACK的存储过程。
- 不支持EXECUTE语句中调用COMMIT/ROLLBACK语句。
- 不支持在CURSOR语句中打开一个含有COMMIT/ROLLBACK的存储过程。
- 不支持带有IMMUTABLE以及SHIPPABLE的存储过程调用COMMIT/ROLLBACK,或调用带有COMMIT/ROLLBACK语句的存储过程。
- 不支持SQL中调用含有COMMIT/ROLLBACK的存储过程,除了SELECT PROC以及CALL PROC。
- 存储过程头带有GUC参数设置的不允许调用COMMIT/ROLLBACK语句。
- 不支持CURSOR/EXECUTE语句,以及各类表达式内调用COMMIT/ROLLBACK。
- 不支持存储过程返回值与表达式计算。
- 不支持提交回滚的内容:
- 不支持存储过程内声明变量以及传入变量的提交/回滚。
- 不支持存储过程内必须重启生效的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;/
- GaussDB工具_gaussdb怎么读_高斯数据库工具_华为云
- GaussDB学习_gaussdb教程_高斯数据库学习_华为云
- GaussDB数据库_gaussdb类型_高斯数据库_华为云
- 华为云数据库 RDS for MySQL常见故障排除_华为云
- GaussDB咋样_openGauss和GaussDB的区别_高斯数据库咋样_华为云
- GaussDB TP_GaussDB和MySQL区别_高斯数据库TP_华为云
- GaussDB配额_GaussDB数据库配额_高斯数据库配额_华为云
- GaussDB免费数据库_GaussDB哪家好_免费高斯数据库
- GaussDB标签_GaussDB数据库标签_高斯数据库标签_华为云
- GaussDB数据库云备份_华为GaussDB_高斯数据库云备份