这个问题之前已经被问过:
在 Postgres 内务管理过程中发现 COMMIT 是不可能的
...但没有一个答案对我有用。
我的存储过程中有一个循环。该循环包含 INSERTs,需要在循环的每一遍结束时将其写入输出表。
ERROR: invalid transaction termination
CONTEXT: PL/pgSQL function [...] at COMMIT
SQL state: 2D000
我尝试了官方文档中的第一个示例: https://www.postgresql.org/docs/12/plpgsql-transactions.html
我仍然收到相同的错误消息。
事实上,我做了一个更简单的例子:
CREATE TABLE test1 (a INTEGER);
CREATE PROCEDURE test_commit()
LANGUAGE plpgsql
AS $$
BEGIN
FOR i IN 0..9 LOOP
INSERT INTO test1 (a) VALUES (i);
COMMIT;
END LOOP;
END;
$$;
CALL test_commit();
同样的错误消息:
ERROR: invalid transaction termination
CONTEXT: PL/pgSQL function test_commit() line 5 at COMMIT
SQL state: 2D000
我正在从 pgAdmin 4 运行代码,并且我尝试打开或关闭“自动提交”...相同的结果。
我做错了什么?
正如评论中所指出的,调用事务处理过程的
CALL
不能与其他语句一起包装在事务中:demo。
类似于您需要单独运行
VACUUM
,因为它拒绝在事务中运行,您必须单独运行 CALL
:
CALL test_commit();
的行,然后点击执行/刷新 F5。CALL test_commit();
移至单独的查询工具选项卡并在那里执行。pgAdmin 查询工具中的两种解决方案都可以工作,无论
autocommit
on
/off
状态如何。在 psql 中,您必须显式打开一个事务才能将其关闭。