1
resposta

Esse método do qual fiz aqui, é um método de se fazer corretamente o looping como o professor passou?

CREATE DEFINER=`root`@`localhost` PROCEDURE `cursor_LOOPING`()
BEGIN
    DECLARE vNome VARCHAR(50);
    DECLARE c CURSOR FOR SELECT NOME FROM tabela_de_clientes ORDER BY NOME;
    DECLARE EXIT HANDLER FOR NOT FOUND CLOSE C;
    Open C;
    WHILE 1 = 1
    DO
        FETCH C INTO vNOME;
        SELECT VNOME;
    END WHILE;
END

CODIGO LOOPING

1 resposta

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 ✓.