我正在使用三个插入语句,如果第三个语句有错误,我想回滚第一个和第二个语句。如果没有办法做到这一点,请告诉我在 PostgresqQL 中处理此问题的不同方法。
如果我使用COMMIT
or ROLLBACK
,我收到错误。
CREATE OR REPLACE FUNCTION TEST1 ()
RETURNS VOID
LANGUAGE 'plpgsql'
AS $$
BEGIN
INSERT INTO table1 VALUES (1);
INSERT INTO table1 VALUES (2);
INSERT INTO table1 VALUES ('A');
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
END;$$;
上面的代码不起作用;COMMIT
and ROLLBACK
PostgreSQL 函数不支持。
您不能使用事务语句,例如SAVEPOINT
, COMMIT
or ROLLBACK
在一个函数中。文档 https://www.postgresql.org/docs/current/plpgsql-transactions.html says:
在调用的过程中CALL
命令以及匿名代码块中(DO
命令),可以使用命令结束事务COMMIT
and ROLLBACK
.
前否定,因为函数不是调用的过程CALL
,你不能在函数中这样做。
The BEGIN
PL/pgSQL 中启动块与 SQL 语句不同BEGIN
启动一个事务。
只需删除COMMIT
从你的函数中,你就有了解决方案:由于整个函数总是在单个事务中运行,所以第三个语句中的任何错误都会导致ROLLBACK
这也会撤销前两个语句。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)