Received: from localhost (unknown [200.46.204.183]) by mail.postgresql.org (Postfix) with ESMTP id 3C3586340AD for ; Fri, 17 Apr 2009 10:53:50 -0300 (ADT) Received: from mail.postgresql.org ([200.46.204.86]) by localhost (mx1.hub.org [200.46.204.183]) (amavisd-maia, port 10024) with ESMTP id 90409-08 for ; Fri, 17 Apr 2009 10:53:47 -0300 (ADT) X-Greylist: from auto-whitelisted by SQLgrey-1.7.6 Received: from sapo.pt (relay6.ptmail.sapo.pt [212.55.154.26]) by mail.postgresql.org (Postfix) with SMTP id 1024B6353A1 for ; Fri, 17 Apr 2009 10:53:46 -0300 (ADT) Received: (qmail 21150 invoked from network); 17 Apr 2009 13:53:37 -0000 Received: from unknown (HELO sapo.pt) (10.134.37.165) by relay6 with SMTP; 17 Apr 2009 13:53:37 -0000 Received: (qmail 11717 invoked from network); 17 Apr 2009 13:53:35 -0000 X-AntiVirus: PTMail-AV 0.3-0.92.0 X-Virus-Status: Clean (0.03365 seconds) Received: from unknown (HELO hmv02) (hmv@[85.240.118.185]) (envelope-sender ) by mta15 (qmail-ldap-1.03) with SMTP for ; 17 Apr 2009 13:53:34 -0000 Message-ID: <9E98F3198C86482FA265D865E8CBC83B@hmv02> From: =?iso-8859-1?Q?H=E9lder_M._Vieira?= To: References: <49E86A4A.4060507@o2tecnologia.com.br> Subject: Re: Problemas com Procedure no PostgreSQL Date: Fri, 17 Apr 2009 14:53:34 +0100 MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_0015_01C9BF6C.485960C0" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2900.5512 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.5579 X-Virus-Scanned: Maia Mailguard 1.0.1 X-Spam-Status: No, hits=0.001 tagged_above=0 required=5 tests=HTML_MESSAGE=0.001 X-Spam-Level: X-Archive-Number: 200904/101 X-Sequence-Number: 32447 This is a multi-part message in MIME format. ------=_NextPart_000_0015_01C9BF6C.485960C0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Boa tarde. > acusado o seguinte erro "sintax error at or near "SELECT" at character = > 487", e infelizmente n=E3o conseguimos achar o que esta errado, dai = pe=E7o=20 Refiz todo o texto, p.f. experimente e diga se resultou. Algumas das altera=E7=F5es que fiz s=E3o meramente estil=EDsticas, = outras t=EAm a ver com quest=F5es gramaticais. As mais significativas = s=E3o: 1. Transcri=E7=E3o para min=FAsculas. Do ponto de vista dos comandos = plpgsql julgo que =E9 indiferente, mas o uso de mai=FAsculas para nomear = objectos no Postgres n=E3o =E9 vantajoso 2. Declara=E7=E3o de par=E2metros. Os alias j=E1 n=E3o s=E3o = necess=E1rios, os par=E2metros podem ser utilizados por nome em vez de = $1, $2, etc... 2. Correc=E7=E3o das estruturas if .. then .. end if=20 3. Reformula=E7=E3o dos ciclos for .. in .. loop .. end loop, que passam = a usar uma vari=E1vel de tipo registo ( declarada como 'rdat record' ) 4. Supress=E3o de alias nos select e update, uma vez que n=E3o h=E1 join = envolvidos=20 Cumprimentos, H=E9lder 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 =3D '' ) then =20 for rdat in select tipo_doc as sfat_documento ,=20 fil_orig as sfat_emissora ,=20 fatura as ifat_numero ,=20 ano as sfat_ano ,=20 parcela as ifat_parcela ,=20 cgc as scod_cliente from ctas_receber where ( status not in ( 'ca', 'co' ) ) and ( dt_pagto is = null ) and ( ( current_timestamp - dt_vencto ) >=3D pdias_vencido = ) order by dt_vencto, tipo_doc, fil_orig, fatura, ano loop select permite_protesto from clientes where cgc =3D rdat.scod_cliente into spermite_bloqueio; if (spermite_bloqueio =3D 't') then -- update clientes set inadimplente =3D 't' ,=20 operador =3D 'bloqueio automatico' ,=20 dt_alteracao =3D current_timestamp where cgc =3D 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; =20 else =20 for rdat in select tipo_doc as sfat_documento ,=20 fil_orig as sfat_emissora ,=20 fatura as ifat_numero ,=20 ano as sfat_ano ,=20 parcela as ifat_parcela ,=20 cgc as scod_cliente from ctas_receber where ( status not in ( 'ca', 'co' )) and ( dt_pagto is null = ) and ( ( current_timestamp - cob.dt_vencto ) >=3D = pdias_vencido ) and ( cgc =3D pcnpj ) order by dt_vencto, tipo_doc, fil_orig, fatura, ano loop =20 select permite_protesto from clientes where cgc =3D scod_cliente into spermite_bloqueio; if ( spermite_bloqueio =3D 't' ) then -- update clientes set inadimplente =3D 't' , operador =3D 'bloqueio automatico' ,=20 dt_alteracao =3D current_timestamp where cgc =3D scod_cliente; -- select count( fat_numero ) from hist_cobranca=20 where ( fat_documento =3D rdat.sfat_documento )=20 and ( fat_emissora =3D rdat.sfat_emissora )=20 and ( fat_numero =3D rdat.ifat_numero ) and ( fat_ano =3D rdta.sfat_ano )=20 and ( fat_parcela =3D ifat_parcela )=20 and ( dta_lancamento =3D current_timestamp ) into inro_registros; -- if ( inro_registros =3D 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; =20 end loop; =20 end if; return true; end; $$ language 'plpgsql'; ------=_NextPart_000_0015_01C9BF6C.485960C0 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
Boa tarde.
 
> acusado o seguinte erro "sintax error at or = near "SELECT"=20 at character
> 487", e infelizmente n=E3o conseguimos achar o que = esta=20 errado, dai pe=E7o
 
 
Refiz todo o texto, p.f. experimente e diga se=20 resultou.
Algumas das altera=E7=F5es que fiz s=E3o meramente = estil=EDsticas,=20 outras t=EAm a ver com quest=F5es gramaticais. As mais = significativas=20 s=E3o:
1. Transcri=E7=E3o para min=FAsculas. Do ponto de = vista dos comandos=20 plpgsql julgo que =E9 indiferente, mas o uso de mai=FAsculas para nomear = objectos no=20 Postgres n=E3o =E9 vantajoso
2. Declara=E7=E3o de par=E2metros. Os alias j=E1 = n=E3o s=E3o necess=E1rios,=20 os par=E2metros podem ser utilizados por nome em vez de $1, $2,=20 etc...
2. Correc=E7=E3o das estruturas if .. then .. end if =
3. Reformula=E7=E3o dos ciclos = for .. in ..=20 loop .. end loop, que passam a usar uma vari=E1vel de tipo registo ( = declarada=20 como 'rdat record' )
4. Supress=E3o de alias nos select e update, uma vez = que n=E3o h=E1=20 join envolvidos 
 
Cumprimentos,
 
H=E9lder M. Vieira

create or replace function trava_inadimplentes ( = pdias_vencido=20 integer, pund_local varchar(3), pcnpj varchar(18) ) returns boolean=20 as
   $$
   = declare
     =20 spermite_bloqueio varchar(1);
      = inro_registros=20 integer;
      = --
     =20 rdat record;
   begin
      if = ( pcnpj=20 =3D '' ) then
   =
        =20 for rdat=20 in
            = select=20 tipo_doc as sfat_documento ,=20
           &nb= sp;      =20 fil_orig as sfat_emissora  ,=20
           &nb= sp;      =20 fatura   as ifat_numero    ,=20
           &nb= sp;      =20 ano      as=20 sfat_ano       ,=20
           &nb= sp;      =20 parcela  as ifat_parcela   ,=20
           &nb= sp;      =20 cgc      as=20 scod_cliente
         &nb= sp; =20 from=20 ctas_receber
         &nb= sp; =20 where ( status not in ( 'ca', 'co' ) ) and ( dt_pagto is null=20 )
           &n= bsp; =20 and ( ( current_timestamp - dt_vencto ) >=3D pdias_vencido=20 )
            = order by=20 dt_vencto, tipo_doc, fil_orig, fatura,=20 ano
        =20 loop
           = ;=20 select=20 permite_protesto
         = ;  =20 from=20 clientes
          &= nbsp;=20 where cgc =3D=20 rdat.scod_cliente
        &nbs= p;  =20 into=20 spermite_bloqueio;
        &nb= sp;  =20 if (spermite_bloqueio =3D 't')=20 then
           = ;   =20 --
           &= nbsp;  =20 update=20 clientes
          &= nbsp;   =20 set inadimplente =3D=20 't'           &nbs= p;      =20 ,=20
           &nb= sp;      =20 operador     =3D 'bloqueio automatico' ,=20
           &nb= sp;      =20 dt_alteracao =3D=20 current_timestamp
        &nbs= p;     =20 where cgc =3D=20 rdat.scod_cliente;
        &nb= sp;     =20 --
           &= nbsp;  =20 insert into=20 hist_cobranca
         &n= bsp;    =20 values ( rdat.sfat_documento, rdat.sfat_emissora, rdat.ifat_numero,=20 rdat.sfat_ano, rdat.ifat_parcela, current_timestamp, pund_local, = 'bloqueio=20 automatico de inadimplente', 'bloqueio automatico', current_timestamp=20 );
            = end=20 if;
         end=20 loop;
      =
     =20 else
   =
         for=20 rdat = in
            = select tipo_doc as sfat_documento ,=20
           &nb= sp;      =20 fil_orig as sfat_emissora  ,=20
           &nb= sp;      =20 fatura   as ifat_numero    ,=20
           &nb= sp;      =20 ano      as=20 sfat_ano       ,=20
           &nb= sp;      =20 parcela  as ifat_parcela   ,=20
           &nb= sp;      =20 cgc      as=20 scod_cliente
         &nb= sp; =20 from=20 ctas_receber
         &nb= sp; =20 where ( status not in ( 'ca', 'co' )) and ( dt_pagto is null=20 )
           &n= bsp; =20 and ( ( current_timestamp - cob.dt_vencto ) >=3D pdias_vencido=20 )
           &n= bsp; =20 and ( cgc =3D pcnpj=20 )
            = order by=20 dt_vencto, tipo_doc, fil_orig, fatura,=20 ano
        =20 loop
        =20
            = select=20 permite_protesto
         = ;  =20 from=20 clientes
          &= nbsp;=20 where cgc =3D=20 scod_cliente
         &nb= sp; =20 into spermite_bloqueio;

          &nbs= p; if (=20 spermite_bloqueio =3D 't' )=20 then
           = ;   =20 --
           &= nbsp;  =20 update=20 clientes
          &= nbsp;   =20 set inadimplente =3D=20 't'           &nbs= p;      =20 ,
           &n= bsp;      =20 operador     =3D 'bloqueio automatico' ,=20
           &nb= sp;      =20 dt_alteracao =3D=20 current_timestamp
        &nbs= p;     =20 where cgc =3D=20 scod_cliente;
         &n= bsp;    =20 --
           &= nbsp;  =20 select count( fat_numero=20 )
           &n= bsp;  =20 from hist_cobranca=20
           &nb= sp;  =20 where ( fat_documento  =3D rdat.sfat_documento )=20
           &nb= sp;    =20 and ( fat_emissora   =3D rdat.sfat_emissora )=20
           &nb= sp;    =20 and ( fat_numero     =3D rdat.ifat_numero=20 )
           &n= bsp;    =20 and ( fat_ano        =3D = rdta.sfat_ano )=20
           &nb= sp;    =20 and ( fat_parcela    =3D ifat_parcela )=20
           &nb= sp;    =20 and ( dta_lancamento =3D current_timestamp=20 )
           &n= bsp;  =20 into=20 inro_registros;
         =      =20 --
           &= nbsp;  =20 if ( inro_registros =3D 0 )=20 then
           = ;      =20 insert into=20 hist_cobranca
         &n= bsp;       =20 values ( rdat.sfat_documento, rdat.sfat_emissora, rdat.ifat_numero,=20 rdat.sfat_ano, rdat.ifat_parcela, current_timestamp, pund_local, = 'bloqueio=20 automatico de inadimplente', 'bloqueio automatico', current_timestamp=20 );
           &= nbsp;  =20 end=20 if;
           =    =20 --
            = end=20 if;
           = =20
         end=20 loop;
      =
      end=20 if;
      return true;
  =20 end;
   $$
   language = 'plpgsql';

------=_NextPart_000_0015_01C9BF6C.485960C0--