Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

ERRO AO UTILIZAR DO WHILE

Olá, tudo bem?!

Estou repentido os passos do professor criando um SP de looping. Utilizei esse código dentro do Create Stored Procedure:


CREATE PROCEDURE `LOOPING_WHILE` (vInicial INT, vFinal INT)
BEGIN
    DECLARE i INT;
    SET i = vInicial;
    WHILE i <= vFinal
    DO
        INSERT INTO TAB_LOOPING (ID) VALUES(i);
        SET i = i+1;
    END WHILE;
    SELECT * FROM TAB_LOOPING;
END

No entanto, quando vou chamar essa SP, a TAB_LOOPING está sendo preenchida não apenas com o valor de i na iteração atual, mas também com 0, de forma intercalada. Segue uma captura da minha tela de retorno (https://ibb.co/jkP679p).

Alguém tem alguma explicação ou sabe como resolver?

3 respostas
solução!

Olá João, tudo bem?

Como você não informou o comando de DELETE, para limpar a tabela TAB_LOOPING, sempre que você chama a procedure, ele não limpa o resultado anterior e vai exibindo todos os resultados juntos, e como o resultado da sua saída esta desordenado, parece que ela está sendo executada de forma errada.

Executei a sua procedure e este foi o resultado:

executando a procedure
  • Sua Procedure
CREATE PROCEDURE `LOOPING_WHILE` (vInicial INT, vFinal INT)
BEGIN
    DECLARE i INT;
    SET i = vInicial;
    WHILE i <= vFinal
    DO
        INSERT INTO TAB_LOOPING (ID) VALUES(i);
        SET i = i+1;
    END WHILE;
    SELECT * FROM TAB_LOOPING;
END
  • A Procedure do instrutor
CREATE PROCEDURE looping_while1(vNumInicial INT, vNumFinal INT) 
BEGIN 
    DECLARE vContador INT; 
    DELETE FROM TAB_LOOPING; 
    SET vContador = vNumInicial;
    WHILE vContador <= vNumFinal 
    DO
        INSERT INTO TAB_LOOPING (ID) VALUES (vContador); 
        SET vContador = vContador + 1; 
    END WHILE; 
    SELECT * FROM TAB_LOOPING; 
END$$

Indico que você edite a sua procedure e informe o comando de delete e em seguida execute novamente para verificar se dessa forma o seu resultado será exibido corretamente.

Aguardo o seu retorno!

Olá, Danielle. Bom dia! Desde já, grato pela sua atenção.

Fiz o que você pediu e adicionei o comando DELETE FROM:


CREATE DEFINER=`root`@`localhost` PROCEDURE `LOOPING_WHILE`(vInicial INT, vFinal INT)
BEGIN
    DECLARE i INT;
    DELETE FROM TAB_LOOPING;

    SET i = vInicial;
    WHILE i <= vFinal
    DO
        INSERT INTO TAB_LOOPING (ID) VALUES(i);
        SET i = i+1;
    END WHILE;

    SELECT * FROM TAB_LOOPING;
END

Infelizmente, o resultado continua sendo o mesmo (https://ibb.co/fndqtSH). A máquina está agindo como se houvesse um INSERT INTO para o valor ZERO dentro do WHILE.

Agora também fiquei intrigado pelo output da sua máquina, uma vez que aqui apesar dos ZEROS a sequencia do contador está correta.

Isso é bem estranho João, executei a sua procedure aqui na minha máquina e funcionou tudo certinho, realmente pode ser algo do seu ambiente, já que aparentemente a sua procedure está correta.

A sequência na minha máquina também está correta, com na sua procedure não existia o comando DELETE, não é realizado a limpeza do resultado anterior e vai exibindo todos os resultados juntos em seguida um do outro. Então, neste print que disponibilizei, o 10 finaliza um execução e o 1 já é o resultado da execução seguinte.