Boa tarde. > acusado o seguinte erro "sintax error at or near "SELECT" at character > 487", e infelizmente não conseguimos achar o que esta errado, dai peço
Refiz todo o texto, p.f. experimente e diga se resultou. Algumas das alterações que fiz são meramente estilísticas, outras têm a ver com questões gramaticais. As mais significativas são: 1. Transcrição para minúsculas. Do ponto de vista dos comandos plpgsql julgo que é indiferente, mas o uso de maiúsculas para nomear objectos no Postgres não é vantajoso 2. Declaração de parâmetros. Os alias já não são necessários, os parâmetros podem ser utilizados por nome em vez de $1, $2, etc... 2. Correcção das estruturas if .. then .. end if 3. Reformulação dos ciclos for .. in .. loop .. end loop, que passam a usar uma variável de tipo registo ( declarada como 'rdat record' ) 4. Supressão de alias nos select e update, uma vez que não há join envolvidos Cumprimentos, Hélder M. Vieira create or replace function trava_inadimplentes ( pdias_vencido integer, pund_local varchar(3), pcnpj varchar(18) ) returns boolean as $$ declare spermite_bloqueio varchar(1); inro_registros integer; -- rdat record; begin if ( pcnpj = '' ) then for rdat in select tipo_doc as sfat_documento , fil_orig as sfat_emissora , fatura as ifat_numero , ano as sfat_ano , parcela as ifat_parcela , cgc as scod_cliente from ctas_receber where ( status not in ( 'ca', 'co' ) ) and ( dt_pagto is null ) and ( ( current_timestamp - dt_vencto ) >= pdias_vencido ) order by dt_vencto, tipo_doc, fil_orig, fatura, ano loop select permite_protesto from clientes where cgc = rdat.scod_cliente into spermite_bloqueio; if (spermite_bloqueio = 't') then -- update clientes set inadimplente = 't' , operador = 'bloqueio automatico' , dt_alteracao = current_timestamp where cgc = rdat.scod_cliente; -- insert into hist_cobranca values ( rdat.sfat_documento, rdat.sfat_emissora, rdat.ifat_numero, rdat.sfat_ano, rdat.ifat_parcela, current_timestamp, pund_local, 'bloqueio automatico de inadimplente', 'bloqueio automatico', current_timestamp ); end if; end loop; else for rdat in select tipo_doc as sfat_documento , fil_orig as sfat_emissora , fatura as ifat_numero , ano as sfat_ano , parcela as ifat_parcela , cgc as scod_cliente from ctas_receber where ( status not in ( 'ca', 'co' )) and ( dt_pagto is null ) and ( ( current_timestamp - cob.dt_vencto ) >= pdias_vencido ) and ( cgc = pcnpj ) order by dt_vencto, tipo_doc, fil_orig, fatura, ano loop select permite_protesto from clientes where cgc = scod_cliente into spermite_bloqueio; if ( spermite_bloqueio = 't' ) then -- update clientes set inadimplente = 't' , operador = 'bloqueio automatico' , dt_alteracao = current_timestamp where cgc = scod_cliente; -- select count( fat_numero ) from hist_cobranca where ( fat_documento = rdat.sfat_documento ) and ( fat_emissora = rdat.sfat_emissora ) and ( fat_numero = rdat.ifat_numero ) and ( fat_ano = rdta.sfat_ano ) and ( fat_parcela = ifat_parcela ) and ( dta_lancamento = current_timestamp ) into inro_registros; -- if ( inro_registros = 0 ) then insert into hist_cobranca values ( rdat.sfat_documento, rdat.sfat_emissora, rdat.ifat_numero, rdat.sfat_ano, rdat.ifat_parcela, current_timestamp, pund_local, 'bloqueio automatico de inadimplente', 'bloqueio automatico', current_timestamp ); end if; -- end if; end loop; end if; return true; end; $$ language 'plpgsql';