Fala galera blz?

Seguinte estou fazendo uma função na qual preciso comparar os valores de uma linha com a sua subsequente. O proplema é que não consigo pegar o valor da próxima linha. Já tentei usar cursores mas não consigo fazer com q rode com scroll, tentei também com id + 1, porém o id não é sequencial. Fiz uma função q varre todo o banco procurando por registros duplicados, resultado: demora 3 mil anos pra realizar :o).

Se alguém já teve algum problema parecido agradeço se ajudar, segue o trecho do código:

----------------------------------------------------------------------------------------------------------------------------------------

CREATE OR REPLACE FUNCTION limpa(timestamp, timestamp) RETURNS void AS


$BODY$

    DECLARE
        inicio    ALIAS FOR $1;
        fim        ALIAS FOR $2;
       
        rad    RECORD;
        conta        RECORD;
        delimitador    RECORD;
        destino    RECORD;
       
        sql        varchar;
        sqlconta    varchar;
        inserir    varchar;
        gw            varchar;
        cliente    varchar;

   
    BEGIN
   
       
        sql := 'SELECT * FROM conta WHERE ( ';       
        sql := sql || 'inicio >= \'' || inicio || '\' and ';
        sql := sql || 'inicio < \'' || fim || '\' ) ORDER BY acctid limit 4 ';

       
       
        FOR radacct IN EXECUTE sql LOOP
                                      
            sqlconta := 'SELECT * FROM conta WHERE ( acctid = '|| ( rad.id + 1) ||' )';--pega o id + 1 e tá errado :o(
                   
            FOR conta IN EXECUTE sqlconta LOOP               
            END LOOP;

                   
            IF( ( radacct.destino = conta.destino ) AND ( radacct.tempo = conta.tempo ) AND ( radacct.cliente = conta.cliente )
                   AND ( substr( radacct.inicio, 1, 19 ) = substr( conta.inicio, 1, 19 ) ) )
                        THEN    BEGIN
                   
                                        IF ( host(radacct.gateway) IS NULL )THEN
                                            gw := host('0.0.0.0');
                                            else
                                                gw := host(radacct.gateway);
                                            END IF;
                                                                                           
                                            inserir := 'INSERT INTO registrosduplicados VALUES ( ...';
                                                   
                                            IF( inserir IS NOT NULL )then
                                                BEGIN
           
                                                    EXECUTE inserir;
           
                                                    EXECUTE 'DELETE FROM conta WHERE id = ' || rad.id;
           
                                                   
                                                    EXIT;
                                                                                               
                                                END;
                                                                                               
                                        END IF;
                   
                                    END;
                   
            END IF;
        END LOOP;

    RETURN;
   
    END;


$BODY$
LANGUAGE 'plpgsql'

------------------------------------------------------------------------------------------------------------------------

[]'s
Tácio Vilela
_______________________________________________
Grupo de Usuários do PostgreSQL no Brasil
Antes de perguntar consulte o manual
http://pgdocptbr.sourceforge.net/

Para editar suas opções ou sair da lista acesse a página da lista em:
http://pgfoundry.org/mailman/listinfo/brasil-usuarios

Responder a