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

Responder a