Re: Problemas com Procedure no PostgreSQL

From: Hélder M(dot) Vieira <hmv(at)mail(dot)telepac(dot)pt>
To: <pgsql-sql(at)postgresql(dot)org>
Subject: Re: Problemas com Procedure no PostgreSQL
Date: 2009-04-17 13:53:34
Message-ID: 9E98F3198C86482FA265D865E8CBC83B@hmv02
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-sql

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';

In response to

Responses

Browse pgsql-sql by date

  From Date Subject
Next Message Paulo (O2 Tecnologia) 2009-04-17 15:08:07 Re: Problemas com Procedure no PostgreSQL
Previous Message Hélder M. Vieira 2009-04-17 12:27:40 Re: Problemas com Procedure no PostgreSQL