Как вы и предполагали, я разделил вставку и разделение на две функции и использовал 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;