我有一些程序,当我在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$
;
答案 0 :(得分:1)
仅在顶级的
CALL
或DO
调用中或嵌套的CALL
或DO
调用中,才可以进行事务控制,而没有任何其他中间命令。例如,如果调用堆栈为CALL proc1()
→CALL proc2()
→CALL proc3()
,则第二和第三过程可以执行事务控制动作。但是,如果调用堆栈为CALL proc1()
→SELECT func2()
→CALL proc3()
,则最后一个过程将无法进行事务控制,因为它们之间是SELECT
。
另一个(未记录)的限制是,您不能使用BEGIN
显式启动事务并将其提交到事务内部。因此,以下操作将失败:
START TRANSACTION;
CALL procedure_with_commit();
在将来的版本中可能会对此进行改进。
实际上,PostgreSQL过程中的事务控制有所限制。
如果您违反任何这些规则,您将收到在问题中描述的错误消息。您可能必须在应用程序中而不是在过程中处理事务-也许将过程分成较小的部分可以实现。