如何自动提交Postgres功能?

时间:2016-09-10 12:58:50

标签: postgresql function plpgsql

我有更新某些字段的功能,我在PostgresSql中开发但我有问题,当我执行函数时,程序(Navicat或Pgadmin)问我"借口!函数返回<>!回滚或提交"消息的屏幕截图message! 当我按下提交或回滚时,它的工作!但我想自动提交,从不问我任何问题! 我试着写BEGIN,End但仍然留言!

这是我的代码:

CREATE OR REPLACE FUNCTION "whis2011"."ComputeRtbAdPlaceCtr"() RETURNS "void" 
    AS $BODY$

BEGIN


    UPDATE "whis2011"."RtbActiveSitePlaces"
    SET "Ctr" = vl."ctr",
        "AverageCpm" = vl."avcpm",
        "AverageClickCost" = vl."avclickcost",
        "IsCtrPredicted" = vl."isctrpredicted",
        "ComputedBalance" = vl."balance"
    FROM "whis2011"."RtbActiveSitePlaces" pl
    JOIN "whis2011"."View_RtbActiveSitePlacesCtrWeekly" vl on pl."Id" = vl."Id";


END;
$BODY$
LANGUAGE plpgsql
COST 100
CALLED ON NULL INPUT
SECURITY INVOKER
VOLATILE;

1 个答案:

答案 0 :(得分:1)

无法显式控制PLpgSQL中的事务。任何函数都在外部事务下运行,并且无法控制函数内部的外部事务。你可以引发异常,这意味着外部事务应该被还原(ROLLBACK)但是来自外部环境。 PLpgSQL关键字BEGINEND与交易无关。

PLpgSQL允许启动嵌套事务,但此事务嵌套。它在异常处理程序运行之前隐式还原,或者在没有任何异常时提交。

BEGIN
  -- implicit BEGIN OF subtransaction
  x := 10; -- protected operations
  -- on the end implicit COMMIT of subtransaction
EXCEPTION WHEN name_of_handled_exception THEN
  -- implicit ROLLBACK
   RAISE NOTICE ...
END;

PostgreSQL不支持类似于" autocommit off"服务器端的模式。当用户使用BEGINCOMMIT时,任何语句都在隐式事务或显式事务下运行。