Postgresql 引发异常时,回滚上一个成功事务

Postgresql 引发异常时,回滚上一个成功事务,postgresql,Postgresql,每当在update语句之后引发异常时,无论更新了什么,都会回滚该异常。 但是,即使异常引发了任何更新,也应该提交它。 请帮帮我 create or replace function modifysal( p_empno IN NUMBER p_newsal IN NUMBER ) RETURNS VOID AS $body$ DECLARE p_error_message text ; p_context text; p_amount numeric:=5; v_sal numeric; beg

每当在update语句之后引发异常时,无论更新了什么,都会回滚该异常。 但是,即使异常引发了任何更新,也应该提交它。 请帮帮我

create or replace function modifysal(
p_empno IN NUMBER
p_newsal IN NUMBER
) RETURNS VOID AS $body$
DECLARE
p_error_message text ;
p_context text;
p_amount numeric:=5;
v_sal numeric;
begin
update emp set sal=p_newsal
where empno=p_empno;
if p_newsal >10000 then
p_error_message:= crt_error('highersalerror',p_newsal);
 raise exception e'%',p_error_message;
    end if;
when raise_exception then
commit;
            GET STACKED DIAGNOSTICS 
                p_error_message = MESSAGE_TEXT,  
                p_context = PG_EXCEPTION_CONTEXT;
                p_error_message := set_context(p_error_message, p_context);
            raise exception e'%', p_error_message;
    when others then
            GET STACKED DIAGNOSTICS 
                p_error_message = MESSAGE_TEXT,  
                p_context = PG_EXCEPTION_CONTEXT;
                p_error_message := set_context(p_error_message, p_context);
            raise exception e'%', p_error_message;

  end;
$body$ LANGUAGE PLPGSQL;

这是设计好的:如果您输入异常处理程序,那么
BEGIN
EXCEPTION
之间的所有内容都将回滚

您必须添加更多的块,才能更好地控制回滚的内容:

BEGIN
   UPDATE ...
   BEGIN
      RAISE EXCEPTION ...
   EXCEPTION
      WHEN ...
   END;
END;

只有在必要时才使用带有
异常
子句的块,因为每个这样的块都会启动一个子事务,这非常昂贵。

这就是事务的定义:要么所有语句都成功,要么没有。您能帮我如何处理此场景吗?您可以尝试使用
保存点
s吗?