Cadê um teste que comprove o possível bug?
>
>> Uso a versão 9.1.1 64 bits no Windows 7 64.
>>
>Antes de dizer que é um bug teste pelo menos na *última* versão
>corretiva (atualmente 9.1.9).
> Euler Taveira Timbira - http://www.timbira.com.br/
> PostgreSQL: Consultoria, Desenvolvimento, Suporte 24x7 e Treinamento
Oi Euler, tentei reproduzir com uma função mais simples, mas não consegui. Se
não se importa, estou colando a função com o erro abaixo. Vou atualizar a
versão pra ver se resolve. De qualquer forma, só queria se saber se não sou eu
que não estou entendo o mecanismo de error trapping. Comentei na função onde o
erro ocorreu e o insert que deveria ter sido voltado pra trás, mas não foi. O
erro que aconteceu naquele ponto foi tratado no único exception when other.
Realmente não consegui reproduzir.
CREATE OR REPLACE FUNCTION public.sp_cobranca_processar_arquivo (
psequencia integer,
pdataprocessamento date,
pconteudo text,
pregistros text
)
RETURNS integer AS
$body$
DECLARE
regCR contas_receber;
xBoleto varchar;
xDataCred date;
xDesc numeric;
xJuros numeric;
xAcresc numeric;
xMulta numeric;
xAbat numeric;
xVlrRem numeric;
xVlrPago numeric;
xIdArquivo integer;
xMsg text;
xTxt text;
regBx record;
BEGIN
-- pregistros:
boleto;;data_credito;;multa;;juros;;acrescimos;;desconto;;abatimento;;pago[#$]
if psequencia is null then
return 0;
end if;
select nextval('seq_cobranca_arquivo')
into xIdArquivo;
insert into cobranca_arquivo(id,data_import_geracao,tipo_arquivo,
------------------------- >>> insert que
deveria ter tipo rollback
sequencial,data_processamento,conteudo)
values(xIdArquivo,CURRENT_TIMESTAMP,'2',psequencia,pdataprocessamento,
pconteudo);
xMsg = '';
-- pregistros:
boleto;;data_credito;;multa;;juros;;acrescimos;;desconto;;abatimento;;pago[#$]
for xBoleto,xDataCred,xMulta,xJuros,xAcresc,xDesc,xAbat,xVlrPago
in select c1::varchar,c2::date,c3::numeric,c4::numeric,c5::numeric,
c6::numeric,c7::numeric,c8::numeric
from sp_texto_to_record(pregistros)
loop
if xMsg <> '' then
xMsg = trim(xMsg) || E'\r\n';
end if;
select * from contas_receber x
where x.boleto = xBoleto::integer
order by id desc limit 1 -- apenas o ultimo
into regCR;
---------------------------------------------------------------------------------------------
>>> o erro aconteceu bem aqui
if not found then
xMsg = xMsg || '- (Erro) Boleto ' || xBoleto || ' não localizado';
continue;
elseif regCR.data_pagto is not null then
xMsg = xMsg || '- (Aviso) Boleto ' || xBoleto || ' já está baixado';
continue;
end if;
begin
-- consolidar todas as remanescentes na c.r. a baixar
select array_to_string(array(select ret_id from
sp_qry_contas_receber_remanesc(regCR.id)),'#$')
into xTxt;
if coalesce(xTxt,'') <> '' then
perform sp_gravar_contas_remanescentes(regCR.id, xTxt);
end if;
select * from sp_qry_contas_receber(null,null,null,null,null,null,
null,regCR.id,xDataCred,null) into regBx; -- atualizado
-- baixar
xJuros = xJuros + xMulta + xAcresc;
if xJuros < regBx.ret_juros_devidos then
xJuros = regBx.ret_juros_devidos;
end if;
xDesc = xDesc + xAbat;
xVlrRem = regBx.ret_valor + regBx.ret_valor_residual
+ xJuros - xDesc - xVlrPago;
if xVlrRem < 0 then
xVlrRem = 0;
end if;
update contas_receber set
desconto = xDesc,
juros = xJuros,
valor_remanesc = xVlrRem,
data_pagto = xDataCred,
id_arquivo_retorno = xIdArquivo
where id = regCR.id;
xMsg = xMsg || '- Boleto ' || xBoleto || ' baixado com sucesso';
exception when others then
xMsg = xMsg || '- (Erro) Boleto ' || xBoleto || ' - ' || sqlerrm;
end;
end loop;
update cobranca_arquivo set
historico = trim(xMsg)
where id = xIdArquivo;
return xIdArquivo;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral