Daniel,
Um colega ajudou tanto que a function ficou assim agora: 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'; Daniel Augusto Bastos escreveu: > > > Opa. > Logo que mandei a mensagem, ví este link aqui. > http://www.postgresql.org/docs/8.3/interactive/plpgsql-control-structures.html#PLPGSQL-CONTROL-STRUCTURES-LOOPS > > <http://www.postgresql.org/docs/8.3/interactive/plpgsql-control-structures.html#PLPGSQL-CONTROL-STRUCTURES-LOOPS> > Tem for sim, mas é direfente, olha a sintaxe no link. > > Abs > Daniel Augusto Bastos > > 2009/4/17 Daniel Augusto Bastos <danbas...@gmail.com > <mailto:danbastos%40gmail.com>> > > > Cara, não lembro e não consegui achar na documentação oficial. > Existe mesmo > > "for select" no PG? > > > > Se não me engano, só tem cursor. > > http://www.postgresql.org/docs/8.3/interactive/plpgsql-cursors.html > <http://www.postgresql.org/docs/8.3/interactive/plpgsql-cursors.html> > > > > Diga-se de passágem, que tb tem no firebird. > > > > Fora isso, não vejo outro problema > > > > Abs > > Daniel Augusto Bastos > > > > > > 2009/4/17 O2 Tecnologia (aJato) <o2tecnolo...@ajato.com.br > <mailto:o2tecnologia%40ajato.com.br>> > > > > > >> > >> 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: > >> > >> 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 > >> IF ( pCNPJ = '' ) THEN > >> BEGIN > >> 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 > >> 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 > >> 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; > >> > >> 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'; > >> > >> > >> > >> > >> > >> __________ Information from ESET NOD32 Antivirus, version of virus > >> signature database 4014 (20090416) __________ > >> > >> The message was checked by ESET NOD32 Antivirus. > >> > >> http://www.eset.com <http://www.eset.com> > >> > >> > >> > >> > >> > >> > >> __________ Information from ESET NOD32 Antivirus, version of virus > >> signature database 4014 (20090416) __________ > >> > >> The message was checked by ESET NOD32 Antivirus. > >> > >> http://www.eset.com <http://www.eset.com> > >> > >> > >> > >> > >> > >> > >> __________ Information from ESET NOD32 Antivirus, version of virus > >> signature database 4014 (20090416) __________ > >> > >> The message was checked by ESET NOD32 Antivirus. > >> > >> http://www.eset.com <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 <http://www.eset.com> > >> > >> > >> > >> > >> ------------------------------------ > >> > >> -- > >> <<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>> > >> > >> > >> > >> > > > > [As partes desta mensagem que não continham texto foram removidas] > > > > > __________ 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 [As partes desta mensagem que não continham texto foram removidas]