1
resposta

[Projeto] Mão na massa - construindo cursor com múltiplos campos

Criei uma SP chamada inclui_usuarios_lista_52_teste para incluir junto do nome um email na temp_nomes.

CREATE DEFINER=`root`@`localhost` PROCEDURE `inclui_usuarios_lista_52_teste`(lista VARCHAR(255))
BEGIN
    DECLARE nome VARCHAR(255);
    DECLARE restante VARCHAR(255);
    DECLARE pos INTEGER;
    
    SET restante = lista;
    
    WHILE INSTR(restante, ',') > 0
    DO
        SET pos = INSTR(restante, ',');
        SET nome = TRIM(LEFT(restante, pos - 1));
        INSERT INTO temp_nomes VALUES (nome, CONCAT(nome, '@email.com'));
        SET restante = substring(restante, pos + 1);
    END WHILE;
    
    IF TRIM(restante) <> '' THEN
        INSERT INTO temp_nomes VALUES (TRIM(restante), CONCAT(TRIM(restante), '@email.com'));
    END IF;
END

NA SP looping_cursor_54_teste eu fiz de duas formas que funcionaram. A primeira foi com dois cursores, para cada campo:

CREATE DEFINER=`root`@`localhost` PROCEDURE `looping_cursor_54_teste`()
BEGIN
    DECLARE fimCursor INTEGER DEFAULT 0;
    DECLARE vNome VARCHAR(255);
    DECLARE vEmail VARCHAR(255);
    DECLARE cursor1 CURSOR FOR SELECT nome from temp_nomes;
    DECLARE cursor2 CURSOR FOR SELECT email from temp_nomes;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET fimCursor = 1;
    
    OPEN cursor1;
    OPEN cursor2;
    FETCH cursor1 INTO vNome;
    FETCH cursor2 INTO vEmail;
    WHILE fimCursor = 0 DO
        SELECT vNome, vEmail;
        FETCH cursor1 INTO vNome;
    END WHILE;
    CLOSE cursor1;
    CLOSE cursor2;
END

A segunda versão foi baseada no exercício da aula anterior, onde usamos um cursor só e passamos no fetch os demais campos. Em ambos obtive o mesmo resultado, mas a segunda forma é mais elegante e utiliza menos recursos de máquina.

CREATE DEFINER=`root`@`localhost` PROCEDURE `looping_cursor_54_teste`()
BEGIN
    DECLARE fimCursor INTEGER DEFAULT 0;
    DECLARE vNome VARCHAR(255);
    DECLARE vEmail VARCHAR(255);
    DECLARE cursor1 CURSOR FOR SELECT nome, email from temp_nomes;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET fimCursor = 1;
    
    OPEN cursor1;
    FETCH cursor1 INTO vNome, vEmail;
    WHILE fimCursor = 0 DO
        SELECT vNome, vEmail;
        FETCH cursor1 INTO vNome, vEmail;
    END WHILE;
    CLOSE cursor1;
END
1 resposta

Olá! Como vai?

Incrível demais a sua sugestão, Vinicius!

Observei que você explorou o uso de cursores para percorrer registros em MySQL, utilizou muito bem o controle de fluxo com WHILE e FETCH e ainda compreendeu a importância de simplificar a lógica ao reduzir de dois cursores para apenas um, tornando o código mais eficiente.

Continue postando as suas soluções, com certeza isso ajudará outros estudantes e tem grande relevância para o fórum.

Sugestão de conteúdo para você mergulhar ainda mais no tema:

Alguns materiais estão em inglês, mas é possível compreendê-los usando o recurso de tradução de páginas do próprio navegador.

Fico à disposição! E se precisar, conte sempre com o apoio do fórum.

Abraço e bons estudos!

AluraConte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!