Caro Paulo,

2009/4/17 Paulo (O2 Tecnologia) <[email protected]>

>
>
> Estamos migrando nossos sistemas de Firebird para PostgreSQL, estamos
> com 99% do processo homologado, mas tropeçamos numa store procedure, que
> não estamos conseguindo portar, ao tentarmos inclui-la no PostgreSQL, é
> 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
> ajuda aos colegas. Segue abaixo a procedure:
>

Legal isso...

Vamos por partes (como diria "Jack")...


>
> CREATE OR REPLACE FUNCTION TRAVA_INADIMPLENTES (
>   DIAS_VENCIDO INTEGER,
>   UND_LOCAL VARCHAR(3),
>   CNPJ VARCHAR(18))
> RETURNS BOOLEAN
> AS
> $$
> DECLARE
>
> pDIAS_VENCIDO ALIAS FOR $1;
> pUND_LOCAL ALIAS FOR $2;
> pCNPJ ALIAS FOR $3;
>
> sPERMITE_BLOQUEIO VARCHAR(1);
> sFAT_DOCUMENTO VARCHAR(2);
> sFAT_EMISSORA VARCHAR(3);
> iFAT_NUMERO INTEGER;
> sFAT_ANO VARCHAR(2);
> iFAT_PARCELA INTEGER;
> sCOD_CLIENTE VARCHAR(18);
> iNRO_REGISTROS INTEGER;
> BEGIN


Até aqui esta OK...


>
>  IF ( pCNPJ = '' ) THEN
>  BEGIN


Veja a sintaxe do IF em plpgsql:
http://www.postgresql.org/docs/8.3/interactive/plpgsql-control-structures.html#PLPGSQL-CONDITIONALS


>
>     FOR
>        SELECT COB.TIPO_DOC, COB.FIL_ORIG, COB.FATURA, COB.ANO,
> COB.PARCELA, COB.CGC
>        FROM CTAS_RECEBER COB
>        WHERE ( COB.STATUS NOT IN ( 'CA', 'CO' )) AND ( COB.DT_PAGTO IS
> NULL )
>          AND (( CURRENT_TIMESTAMP - COB.DT_VENCTO ) >= pDIAS_VENCIDO )
>        ORDER BY COB.DT_VENCTO, COB.TIPO_DOC, COB.FIL_ORIG, COB.FATURA,
> COB.ANO
>        INTO sFAT_DOCUMENTO, sFAT_EMISSORA, iFAT_NUMERO, sFAT_ANO,
> iFAT_PARCELA, sCOD_CLIENTE
>     DO
>     BEGIN


Veja a sintaxe do FOR em plpgsql:
http://www.postgresql.org/docs/8.3/interactive/plpgsql-control-structures.html#PLPGSQL-RECORDS-ITERATING


>
>        SELECT CLI.PERMITE_PROTESTO
>        FROM CLIENTES CLI
>        WHERE CLI.CGC = sCOD_CLIENTE
>        INTO sPERMITE_BLOQUEIO;
>
>        IF (sPERMITE_BLOQUEIO = 'T') THEN
>        BEGIN
>           UPDATE CLIENTES CLI
>           SET CLI.INADIMPLENTE = 'T', CLI.OPERADOR = 'BLOQUEIO
> AUTOMATICO', CLI.DT_ALTERACAO = CURRENT_TIMESTAMP
>           WHERE CLI.CGC = sCOD_CLIENTE;
>
>           INSERT INTO HIST_COBRANCA
>           VALUES ( sFAT_DOCUMENTO, sFAT_EMISSORA, iFAT_NUMERO,
> sFAT_ANO, iFAT_PARCELA, CURRENT_TIMESTAMP, pUND_LOCAL,
>                    'BLOQUEIO AUTOMATICO DE INADIMPLENTE', 'BLOQUEIO
> AUTOMATICO', CURRENT_TIMESTAMP );
>        END IF;
>     END
>  END IF
>  ELSE
>  BEGIN


Aqui novamente precisas olhar a sintaxe do "IF" em plpgsql:
http://www.postgresql.org/docs/8.3/interactive/plpgsql-control-structures.html#PLPGSQL-CONDITIONALS


>
>     FOR
>        SELECT COB.TIPO_DOC, COB.FIL_ORIG, COB.FATURA, COB.ANO,
> COB.PARCELA, COB.CGC
>        FROM CTAS_RECEBER COB
>        WHERE ( COB.STATUS NOT IN ( 'CA', 'CO' )) AND ( COB.DT_PAGTO IS
> NULL )
>         AND (( CURRENT_TIMESTAMP - COB.DT_VENCTO ) >= pDIAS_VENCIDO )
>         AND ( COB.CGC = pCNPJ )
>        ORDER BY COB.DT_VENCTO, COB.TIPO_DOC, COB.FIL_ORIG, COB.FATURA,
> COB.ANO
>        INTO sFAT_DOCUMENTO, sFAT_EMISSORA, iFAT_NUMERO, sFAT_ANO,
> iFAT_PARCELA, sCOD_CLIENTE
>     DO
>     BEGIN
>        SELECT CLI.PERMITE_PROTESTO
>        FROM CLIENTES CLI
>        WHERE CLI.CGC = sCOD_CLIENTE
>        INTO sPERMITE_BLOQUEIO;


Aqui precisas verificar a atribuição do retorno de um SELECT:
http://www.postgresql.org/docs/8.3/interactive/plpgsql-statements.html#PLPGSQL-STATEMENTS-ASSIGNMENT

Creio que esse teu SELECT não irá funcionar com o INTO no final... pela
documentação ele tem que estar antes da cláusula FROM...



>
>        IF (sPERMITE_BLOQUEIO = 'T') THEN
>        BEGIN
>           UPDATE CLIENTES CLI
>           SET CLI.INADIMPLENTE = 'T', CLI.OPERADOR = 'BLOQUEIO
> AUTOMATICO', CLI.DT_ALTERACAO = CURRENT_TIMESTAMP
>           WHERE CLI.CGC = sCOD_CLIENTE;
>
>           SELECT COUNT( HIS.FAT_NUMERO )
>           FROM HIST_COBRANCA HIS
>           WHERE ( HIS.FAT_DOCUMENTO = sFAT_DOCUMENTO ) AND (
> HIS.FAT_EMISSORA = sFAT_EMISSORA ) AND ( HIS.FAT_NUMERO = iFAT_NUMERO )
>            AND ( HIS.FAT_ANO = sFAT_ANO ) AND ( HIS.FAT_PARCELA =
> iFAT_PARCELA ) AND ( HIS.DTA_LANCAMENTO = CURRENT_TIMESTAMP )
>           INTO iNRO_REGISTROS;
>
>           IF (iNRO_REGISTROS = 0) then
>        BEGIN
>          INSERT INTO HIST_COBRANCA
>          VALUES ( sFAT_DOCUMENTO, sFAT_EMISSORA, iFAT_NUMERO,
> sFAT_ANO, iFAT_PARCELA, CURRENT_TIMESTAMP, pUND_LOCAL,
>                   'BLOQUEIO AUTOMATICO DE INADIMPLENTE', 'BLOQUEIO
> AUTOMATICO', CURRENT_TIMESTAMP );
>        END
>     END
>   END
>  END
>
>
>  RETURN TRUE;
> END;
> $$
>
> LANGUAGE 'plpgsql';
>
>
Pelo que percebi é só uma questão de adaptar os teus IFs, FORs e o retorno
do SELECT pela sintaxe adequada em plpgsql...

Se tiveres mais dúvidas manda ai...

Cordialmente,

-- 
Fabrízio de Royes Mello
>> Blog sobre PostgreSQL: http://fabriziomello.blogspot.com
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a