Pular para o conteúdo

Fóruns SQL e PL/SQL PL SQL Recursivo Responder a: PL SQL Recursivo

#145558
Avatar photoJosé Laurindo Chiappa
Moderador

    Blz ? Então, no SEU caso específico, vi que a coluna SALDO está nula nos registros abaixo do primeiro :

    PLACONTA           PEREXERCICIO  PERNUMERO   IDPESSOA        MOV SALDOANTERIOR      SALDO
    ------------------ ------------ ---------- ---------- ---------- ------------- ----------
    215103202                  2019          1        541   68426,25    -161601,31  -93175,06
    215103202                  2019          2        541  -40965,24                         
    215103202                  2019          3        541    19639,5                         
    215103202                  2019          4        541  -45379,32                         
    215103202                  2019          5        541   42082,43                         
    
    5 linhas selecionadas.

    ==> Então de NADA adianta vc LER (com LAG, como indiquei) o conteúdo ATUAL da coluna SALDO dos registros posteriores, pois ele está NULL : na verdade o que vc precisa pelo que vejo é realmente fazer um UPDATE nas linha POSTERIORES ao registro 1 com o valor ATUALIZADO do registro anterior…. Talvez até desse pra montar uma query cheia de subqueries , ou (talvez) uma Função que pudesse ser chamada a partir do UPDATE, mas IMHO a maneira mais simples (melhor pra dar manutenção mais tarde) seria mesmo um Cursor Loop …. Tipo (em pseudo-código) :

    declare
       v_registro_anterior SALDOTESTE%rowtype;
    for r in (select * from SALDOTESTE order by PERNUMERO) loop
       if r.PERNUMERO > 1 then
          select * into v_registro_anterior from SALDOTESTE where pernumero = r.pernumero - 1;
          update SALDOTESTE set SALDO = v_registro_anterior.SALDO + r.mov where PERNUMERO = r.PERNUMERO;
       end if;
    end loop;

    ==> veja, esta lógica FAZ o que vc quer (ie, atualizar do registro 2 em diante a coluna SALDO com o valor do SALDO DA LINHA ANTERIOR somando o valor da coluna MOV do registro atual) , e em MUITO menos linhas de código do que a tua traquitana anterior….
    Isso NÃO seria a mais performática das Operações (mas modelagens desse tipo, onde a ORDEM dos registros tem significado numa tabela muitas vezes levam à isso), mas ACREDITO que com os índices corretos nem os n SELECTs pra ler o registro anterior e nem os n UPDATEs incorreriam em full table scan, seriam resolvidos por INDEX ACCESS direto (ou então por ROWID se vc incluir o ROWID no LOOP), o que deve ser bom o suficiente… teste lá….

    []s

    Chiappa