› Fóruns › SQL e PL/SQL › PL SQL Recursivo › Responder a: PL SQL Recursivo
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