无效的交易终止

时间:2019-12-03 14:15:42

标签: postgresql

我有一些程序,当我在dbeaver中执行时可以正常工作而没有问题,但是当我从外部程序调用它时,我在下面遇到错误。我不想在这里复制/粘贴完整过程,因为它很大并且可以在db工具中使用。我只是复制/粘贴顶部和底部。可能是什么原因造成的?

过程:

Copy-Item 'd:\doc\*' -destination \\$tst\d$\test

错误:

CREATE OR REPLACE PROCEDURE MyProcedure(lot of args..)
 LANGUAGE plpgsql
AS $procedure$
DECLARE
.....
.....
COMMIT;
END;
$procedure$
;

1 个答案:

答案 0 :(得分:1)

The documentation说:

  

仅在顶级的CALLDO调用中或嵌套的CALLDO调用中,才可以进行事务控制,而没有任何其他中间命令。例如,如果调用堆栈为CALL proc1()CALL proc2()CALL proc3(),则第二和第三过程可以执行事务控制动作。但是,如果调用堆栈为CALL proc1()SELECT func2()CALL proc3(),则最后一个过程将无法进行事务控制,因为它们之间是SELECT

另一个(未记录)的限制是,您不能使用BEGIN显式启动事务并将其提交到事务内部。因此,以下操作将失败:

START TRANSACTION;
CALL procedure_with_commit();

在将来的版本中可能会对此进行改进。

实际上,PostgreSQL过程中的事务控制有所限制。

如果您违反任何这些规则,您将收到在问题中描述的错误消息。您可能必须在应用程序中而不是在过程中处理事务-也许将过程分成较小的部分可以实现。