与 postgresql 的交易

transaction with postgresql

我是 Postgresql 的新手,我尝试用 Oracle 做一些如此简单的事情。

我创建了一个程序,里面有一段简单的代码:

CREATE OR REPLACE PROCEDURE user.test_proc(IN param1 character varying)
LANGUAGE 'plpgsql'

AS $BODY$
DECLARE
   i text;
BEGIN

   if param1 = '1' then
     insert into amian.test values ('1', '1');
     rollback;
   else
      insert into amian.test values('2','2');
      commit;
   end if;
end;
$BODY$;

我在 unix 环境中使用 psql :

psql –p port–d base–U user
\set AUTOCOMMIT off
call user.test_proc('2');

程序遇到 COMMIT 时出现此错误:

invalid transaction termination 

怎么了?我应该怎么做(我想关闭自动提交)?

谢谢

如果过程在其自己的事务中 运行(自动提交模式),则只能在过程中使用 COMMITROLLBACK。请参阅 the documentation 中的这句话:

If CALL is executed in a transaction block, then the called procedure cannot execute transaction control statements. Transaction control statements are only allowed if CALL is executed in its own transaction.

psql 中关闭自动提交会导致客户端在 CALL 语句之前发送 BEGIN,因此您处于显式启动的事务中。这导致了问题。

此限制可能会在未来的某个时候取消,但目前是这样。

不要禁用自动提交。您正在冒着长时间事务的风险,这可能会损害数据库的健康状况。