обработка исключений и транзакций - PullRequest
0 голосов
/ 10 января 2020

Как вы и предполагали, я разделил вставку и разделение на две функции и использовал COMMIT. Но выдает ошибку.

ErrMsg: недопустимое завершение транзакции.

Вставка должна произойти в таблице клиентов. И поднять ошибку «Invalidpay», так как p_paid равен 0.

create or replace  function creatpayment_dest_function(p_acn IN  VARCHAR,
                                           p_seq   IN  NUMERIC,
                                           p_paid IN NUMERIC,
                                           p_seq_ot OUT numeric) AS
    $body$
    declare
    errmsg text;
    v_ctx text;
    p_pmny numeric:=100;
BEGIN 
insert into customer values(100,'CXS'); 
commit;  
exception
            when raise_exception then
              get STACKED diagnostics errmsg = MESSAGE_TEXT, 
                                      v_ctx = PG_EXCEPTION_CONTEXT;
              errmsg := set_context(errmsg,v_ctx);
              raise exception e'%', errmsg;
            when others then
              get STACKED diagnostics errmsg = MESSAGE_TEXT, 
                                      v_ctx = PG_EXCEPTION_CONTEXT;
              errmsg := set_context(errmsg,v_ctx);
              raise exception e'%', errmsg;
END; end $body$ language plpgsql;


create or replace  function creatpayment_dest_exception(p_paid)
AS
$body$
BEGIN 
if (coalesce(p_paid, 0) = 0) then
v_errorMsg:= gnvgen.createerrormessage( 'Invalidpay');    
raise exception e'%',v_errorMsg;
end if;     
        exception
            when raise_exception then
              get STACKED diagnostics errmsg = MESSAGE_TEXT, 
                                      v_ctx = PG_EXCEPTION_CONTEXT;
              errmsg := set_context(errmsg,v_ctx);
              raise exception e'%', errmsg;
            when others then
              get STACKED diagnostics errmsg = MESSAGE_TEXT, 
                                      v_ctx = PG_EXCEPTION_CONTEXT;
              errmsg := set_context(errmsg,v_ctx);
              raise exception e'%', errmsg;
END; end $body$ language plpgsql;

1 Ответ

0 голосов
/ 10 января 2020

Есть две проблемы:

  1. Вы используете RAISE в обработчике исключений.

  2. У вас есть INSERT, который вы хотите сохранить в блоке обработчик исключений.

Если вы RAISE и исключение в обработчике исключений, это приведет к сбою функции с ошибкой, что означает, что вся транзакция откатывается.

Код должен выглядеть следующим образом:

BEGIN
   PERFORM ctpay_function(...);

   BEGIN
      PERFORM allocpaymentNIC_function(...);
   EXCEPTION
      WHEN ... THEN
         /* log the error somewhere */
   END;
END;

Запись ошибки может означать вставку чего-либо в таблицу или использование RAISE NOTICE или RAISE WARNING, что не приведет к сообщению об ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...