Nao consegui entender o porque da repeticao do nome da beatriz e consequentemente o pq a solucao foi necessária
Nao consegui entender o porque da repeticao do nome da beatriz e consequentemente o pq a solucao foi necessária
Oi Davi, tudo bem?
No primeiro código, a repetição do nome "Beatriz" acontece por causa do local onde o primeiro FETCH
é realizado dentro do loop WHILE
. Vou explicar o comportamento em etapas para facilitar o entendimento:
OPEN cursor1;
WHILE fimCursor = 0 DO
SELECT vnome; -- (1) Exibe o valor de `vnome` antes do próximo valor ser buscado
FETCH cursor1 INTO vnome; -- (2) Busca o próximo nome do cursor e coloca em `vnome`
END WHILE;
CLOSE cursor1;
vnome
é exibido (SELECT vnome
) antes de buscar o próximo valor do cursor, ou seja, antes de ser atualizado.vnome
com FETCH
.fimCursor
só é alterado após o FETCH
falhar, o loop ainda imprime novamente o valor de vnome
, que contém "Beatriz".Já no segundo código, o comportamento é diferente:
OPEN cursor1;
FETCH cursor1 INTO vnome; -- (1) Busca o primeiro nome antes de começar o loop
WHILE fimCursor = 0 DO
SELECT vnome; -- (2) Aqui, vnome é exibido, que já contém o valor atual
FETCH cursor1 INTO vnome; -- (3) Busca o próximo nome para a próxima iteração
END WHILE;
CLOSE cursor1;
FETCH cursor1 INTO vnome;
. Assim, vnome
já contém o primeiro nome da tabela.vnome
, que foi carregado anteriormente.FETCH
para obter o próximo nome.fimCursor
é definido como 1, e o loop termina sem repetir o último nome.Portanto, a diferença está no momento em que o vnome
é atualizado. No primeiro código, o valor é exibido antes do FETCH
, o que causa a repetição do último nome. Já no segundo código, o valor é buscado antes do loop, e dentro do loop o valor exibido é sempre o correto. Assim, não há repetição.
Espero ter ajudado.
Qualquer dúvida, não hesite em compartilhar no fórum.
Abraços!