Oi, Jean, tudo bem?
Peço desculpas por demorar a te responder.
A forma com que você construiu o loop, embora funcione nesse cenário, não é a mais adequada a se realizar. Quando utilizamos a estrutura WHILE
, é importante pensar em condições que façam sentido dentro do contexto da Stored Procedure e que, de certa maneira, esteja sob o nosso controle. Isso é importante para que se evitem problemas de manutenção do nosso sistema, bem como de manipulação de dados.
No código que você compartilhou conosco, temos o seguinte looping:
WHILE 1 = 1
DO
FETCH C INTO vNOME;
SELECT VNOME;
END WHILE;
Haja vista que o número 1 sempre será igual a 1, a repetição tende a continuar “infinitamente”, o que a faz parar, na realidade, é o tratamento de erro DECLARE EXIT HANDLER FOR NOT FOUND CLOSE C
, o qual informa que deverá acontecer uma interrupção do processo caso não sejam mais encontrados valores. Em um outro cenário, a organização dos comandos poderia não ser igual a essa (com tratamento de erro), o que geraria uma execução ininterrupta e, consequentemente, um erro seria retornado.
Durante o vídeo, a estratégia utilizada pelo instrutor foi criar uma variável que armazena se o cursor chegou ou não ao fim e usá-la como condição do WHILE
, observe:
CREATE PROCEDURE `cursor_looping` ()
BEGIN
DECLARE fim_do_cursor INT DEFAULT 0; #aqui está a variável!
DECLARE vNome VARCHAR(50);
DECLARE c CURSOR FOR SELECT NOME FROM tabela_de_clientes;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET fim_do_cursor = 1;
OPEN c;
WHILE fim_do_cursor = 0 # aqui está a condição
DO
FETCH c INTO vNome;
IF fim_do_cursor = 0 THEN
SELECT vNome;
END IF;
END WHILE;
CLOSE c;
END$$
DELIMITER ;
Quando criamos a condição fim_do_cursor = 0
, passamos a ter um controle maior sobre o looping. Em outros momentos cujo WHILE
também é necessário, é super interessante implementar tal estratégia, visto que não é algo aplicável somente a um contexto específico, mas sim uma coisa que pode ser expandida para outras ocasiões — ou seja, trata-se de uma boa prática.
Com o tempo, questões como essa vão ficando mais claras conforme nos aprofundamos nos assuntos. Espero ter ajudado a entender o uso do looping, Jean. Se surgir alguma dúvida após minha explicação ou durante os seus estudos, fico à disposição para ajudar.
Um forte abraço.
Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.