1
resposta

FETCH

Nao consegui entender o porque da repeticao do nome da beatriz e consequentemente o pq a solucao foi necessária

1 resposta

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;
  1. Primeiro, o valor de vnome é exibido (SELECT vnome) antes de buscar o próximo valor do cursor, ou seja, antes de ser atualizado.
  2. Depois, o cursor busca o próximo nome e armazena em vnome com FETCH.
  3. Quando o cursor chega ao fim, o último nome ("Beatriz") já foi exibido. Como o 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;
  1. O primeiro valor é buscado antes de entrar no loop, com FETCH cursor1 INTO vnome;. Assim, vnome já contém o primeiro nome da tabela.
  2. Dentro do loop, exibimos o valor atual de vnome, que foi carregado anteriormente.
  3. Após exibir o valor, fazemos um novo FETCH para obter o próximo nome.
  4. Quando o cursor chega ao final, 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!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado