Received: from localhost (unknown [200.46.204.183]) by mail.postgresql.org (Postfix) with ESMTP id CE20A6326A5 for ; Fri, 17 Apr 2009 12:10:31 -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 75800-08 for ; Fri, 17 Apr 2009 12:10:29 -0300 (ADT) X-Greylist: delayed 00:05:29.134645 by SQLgrey-1.7.6 Received: from hm1480-9.locaweb.com.br (hm1480-9.locaweb.com.br [201.76.49.106]) by mail.postgresql.org (Postfix) with ESMTP id A04E56325E9 for ; Fri, 17 Apr 2009 12:10:23 -0300 (ADT) Received: from hm401.locaweb.com.br (10.1.10.37) by hm1480-9.locaweb.com.br (PowerMTA(TM) v3.5r12) id ht2du80nva4j for ; Fri, 17 Apr 2009 12:10:21 -0300 (envelope-from ) Received: from unknown (HELO ?192.168.1.210?) (paulo@o2tecnologia.com.br@201.83.122.163) by hm401.locaweb.com.br with SMTP; 17 Apr 2009 15:10:20 -0000 X-LocaWeb-COR: locaweb_2009_x-mail Message-ID: <49E89C9B.1090908@o2tecnologia.com.br> Date: Fri, 17 Apr 2009 12:13:31 -0300 From: "Paulo (O2 Tecnologia)" User-Agent: Thunderbird 2.0.0.21 (Windows/20090302) MIME-Version: 1.0 To: =?ISO-8859-1?Q?=22H=E9lder_M=2E_Vieira=22?= CC: pgsql-sql@postgresql.org Subject: Re: Problemas com Procedure no PostgreSQL References: <49E86A4A.4060507@o2tecnologia.com.br> <9E98F3198C86482FA265D865E8CBC83B@hmv02> In-Reply-To: <9E98F3198C86482FA265D865E8CBC83B@hmv02> Content-Type: multipart/alternative; boundary="------------070502060107040903000802" 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/103 X-Sequence-Number: 32449 This is a multi-part message in MIME format. --------------070502060107040903000802 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit A function was so far: 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 FAT_DOCUMENTO, FIL_ORIG AS FAT_EMISSORA, FATURA AS FAT_NUMERO, ANO AS FAT_ANO, PARCELA AS FAT_PARCELA, CGC AS COD_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.COD_CLIENTE INTO SPERMITE_BLOQUEIO; IF (SPERMITE_BLOQUEIO = 'T') THEN -- UPDATE CLIENTES SET INADIMPLENTE = 'T', OPERADOR = 'BLOQUEIO AUTOMATICO', DT_ALTERACAO = CURRENT_TIMESTAMP WHERE CGC = RDAT.COD_CLIENTE; -- INSERT INTO HIST_COBRANCA VALUES ( RDAT.FAT_DOCUMENTO, RDAT.FAT_EMISSORA, RDAT.FAT_NUMERO, RDAT.FAT_ANO, RDAT.FAT_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 FAT_DOCUMENTO, FIL_ORIG AS FAT_EMISSORA, FATURA AS FAT_NUMERO, ANO AS FAT_ANO, PARCELA AS FAT_PARCELA, CGC AS COD_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 = RDAT.COD_CLIENTE INTO SPERMITE_BLOQUEIO; IF ( SPERMITE_BLOQUEIO = 'T' ) THEN -- UPDATE CLIENTES SET INADIMPLENTE = 'T', OPERADOR = 'BLOQUEIO AUTOMATICO', DT_ALTERACAO = CURRENT_TIMESTAMP WHERE CGC = RDAT.COD_CLIENTE; -- SELECT COUNT( FAT_NUMERO ) FROM HIST_COBRANCA WHERE ( FAT_DOCUMENTO = RDAT.FAT_DOCUMENTO ) AND ( FAT_EMISSORA = RDAT.FAT_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.FAT_DOCUMENTO, RDAT.FAT_EMISSORA, RDAT.FAT_NUMERO, RDAT.FAT_ANO, RDAT.FAT_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'; Thank you all for help, Paulo Santana O2 Tecnologia em Sistemas Hélder M. Vieira escreveu: > 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'; > > > > __________ Information from ESET NOD32 Antivirus, version of virus > signature database 4016 (20090417) __________ > > The message was checked by ESET NOD32 Antivirus. > > http://www.eset.com __________ Information from ESET NOD32 Antivirus, version of virus signature database 4016 (20090417) __________ The message was checked by ESET NOD32 Antivirus. http://www.eset.com --------------070502060107040903000802 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit

A function was so far:


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 FAT_DOCUMENTO, FIL_ORIG AS FAT_EMISSORA, FATURA AS FAT_NUMERO, ANO AS FAT_ANO, PARCELA  AS FAT_PARCELA, CGC AS COD_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.COD_CLIENTE
            INTO SPERMITE_BLOQUEIO;

            IF (SPERMITE_BLOQUEIO = 'T') THEN
               --
               UPDATE CLIENTES
               SET INADIMPLENTE = 'T', OPERADOR = 'BLOQUEIO AUTOMATICO', DT_ALTERACAO = CURRENT_TIMESTAMP
               WHERE CGC = RDAT.COD_CLIENTE;
               --
               INSERT INTO HIST_COBRANCA
               VALUES ( RDAT.FAT_DOCUMENTO, RDAT.FAT_EMISSORA, RDAT.FAT_NUMERO, RDAT.FAT_ANO, RDAT.FAT_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 FAT_DOCUMENTO, FIL_ORIG AS FAT_EMISSORA, FATURA AS FAT_NUMERO, ANO AS FAT_ANO, PARCELA  AS FAT_PARCELA, CGC AS COD_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 = RDAT.COD_CLIENTE
            INTO SPERMITE_BLOQUEIO;

            IF ( SPERMITE_BLOQUEIO = 'T' ) THEN
               --
               UPDATE CLIENTES
               SET INADIMPLENTE = 'T', OPERADOR = 'BLOQUEIO AUTOMATICO', DT_ALTERACAO = CURRENT_TIMESTAMP
               WHERE CGC = RDAT.COD_CLIENTE;
               --
               SELECT COUNT( FAT_NUMERO )
               FROM HIST_COBRANCA
               WHERE ( FAT_DOCUMENTO = RDAT.FAT_DOCUMENTO ) AND ( FAT_EMISSORA = RDAT.FAT_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.FAT_DOCUMENTO, RDAT.FAT_EMISSORA, RDAT.FAT_NUMERO, RDAT.FAT_ANO, RDAT.FAT_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';


Thank you all for help,

Paulo Santana
O2 Tecnologia em Sistemas

Hélder M. Vieira escreveu:
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';



__________ Information from ESET NOD32 Antivirus, version of virus signature database 4016 (20090417) __________

The message was checked by ESET NOD32 Antivirus.

http://www.eset.com


__________ Information from ESET NOD32 Antivirus, version of virus signature database 4016 (20090417) __________

The message was checked by ESET NOD32 Antivirus.

http://www.eset.com
--------------070502060107040903000802--