2016-09-10 46 views
0

我有更新一些字段,我在PostgresSql中開發的功能,但我有問題,當我執行功能程序(Navicat或Pgadmin)問我「Excuse!函數返回<>!回滾或提交」附加消息的屏幕截圖message! 當我按提交或回滾時,這是工作!但我想自動提交,絕不會問我任何問題! 我試圖寫BEGIN,結束但仍然是消息!如何自動提交Postgres函數?

這裏是我的代碼:

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

只需將您的SQL客戶端設置爲autocommit即可。 –

+1

'FROM「whis2011」。「RtbActiveSitePlaces」pl'您應該**不要**將目標表包含在Postgres SQL中的FROM ...列表中。 (並且你不需要plpgsql進行這個簡單的更新,普通的SQL會這樣做) – wildplasser

+0

這個問題並不清楚。也許你正在用'BEGIN'和['COMMIT'](https://www.postgresql.org/docs/current/static/sql-commit.html)函數的'BEGIN'和'END'來處理事務處理在SQL中? Postgres函數本身不能自動提交 - 這取決於調用SQL上下文。 –

回答

0

是不可能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不支持類似於服務器端「自動提交關閉」模式的任何內容。當用戶使用BEGIN,COMMIT時,任何語句都在隱式事務或顯式事務下運行。