我有更新某些字段的功能,我在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;
答案 0 :(得分:1)
无法显式控制PLpgSQL中的事务。任何函数都在外部事务下运行,并且无法控制函数内部的外部事务。你可以引发异常,这意味着外部事务应该被还原(ROLLBACK)但是来自外部环境。 PLpgSQL关键字BEGIN
,END
与交易无关。
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"服务器端的模式。当用户使用BEGIN
,COMMIT
时,任何语句都在隐式事务或显式事务下运行。