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