我无法在程序内提交

问题描述 投票:0回答:1

这个问题之前已经被问过:

在 Postgres 内务管理过程中发现 COMMIT 是不可能的

Postgresql 调用过程时事务终止无效

...但没有一个答案对我有用。

我的存储过程中有一个循环。该循环包含 INSERTs,需要在循环的每一遍结束时将其写入输出表。

  • 如果我不使用 COMMIT,我需要等到存储过程结束才能访问结果。
  • 当我插入 COMMIT(就在“结束循环”之前)时,我收到以下错误消息:
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 运行代码,并且我尝试打开或关闭“自动提交”...相同的结果。

我做错了什么?

postgresql stored-procedures pgadmin
1个回答
0
投票

正如评论中所指出的,调用事务处理过程的

CALL
不能与其他语句一起包装在事务中:demo

类似于您需要单独运行

VACUUM
,因为它拒绝在事务中运行,您必须单独运行
CALL

  1. 仅选择带有
    CALL test_commit();
    的行,然后点击执行/刷新 F5
  2. CALL test_commit();
    移至单独的查询工具选项卡并在那里执行。
  3. 从 pgAdmin 查询工具切换到 PSQL 工具并在那里运行它。

pgAdmin 查询工具中的两种解决方案都可以工作,无论

autocommit
on
/
off
状态如何。在 psql 中,您必须显式打开一个事务才能将其关闭。

© www.soinside.com 2019 - 2024. All rights reserved.