1
resposta

Mão na massa: construindo cursor com múltiplos campos

Buenas noches,

Procedimiento que realiza la separación de los datos (nombre, email), en dos columnas.

DELIMITER $$
CREATE PROCEDURE `tipoDados16`(lista VARCHAR(255), lista2 VARCHAR(255))
BEGIN
    DECLARE nome VARCHAR(255);
    DECLARE email VARCHAR (255);
    DECLARE restante1 VARCHAR(255);
    DECLARE restante2 VARCHAR(255);
    DECLARE pos1 INTEGER;
    DECLARE pos2 INTEGER;
    
    
    SET restante1=lista;
    SET restante2=lista2;
    
    WHILE INSTR(restante1,',')>0 AND  INSTR(restante2, ',') > 0  DO
        SET pos1=INSTR(restante1,',');
        SET pos2=INSTR(restante2,',');
    
        
        SET nome= LEFT(restante1, pos1 -1);
        SET email= LEFT(restante2, pos2 -1);
        
        
        INSERT INTO temp_nomes(nome, email) VALUES (TRIM(nome),TRIM(email));
        
        SET restante1= SUBSTRING(restante1, pos1+1);
        SET restante2= SUBSTRING(restante2, pos2+1);
        
    END WHILE;
    IF TRIM(restante1) <> '' AND TRIM(restante2) <> '' THEN
        INSERT INTO temp_nomes(nome, email) VALUES (TRIM(restante1), TRIM(restante2));
    END IF;
     
    
    
END$$
DELIMITER ;

cursor actualizado para listar resultados por persona

DELIMITER $$
CREATE PROCEDURE `loopingCursor2`()
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 AS nome, vemail AS email;
        FETCH cursor1 INTO vnome, vemail;
   
    END WHILE;
    CLOSE cursor1;
    
   END$$
DELIMITER ;

creación de la tabla temporal y llamadas a los procedimientos.

DROP TEMPORARY TABLE IF EXISTS temp_nomes;
CREATE TEMPORARY TABLE temp_nomes (nome VARCHAR (255), email VARCHAR (255));
CALL tipoDados16('Joe Fernandez,Laura Vasquez,Belen Vasquez,Catalina Ballon', 'jfernandez@gmail.com,lvasquez@gmail.com,bvasquez@gmail.com,cballon@gmail.com');
SELECT * FROM temp_nomes;
CALL loopingCursor2();

Garanta sua matrícula hoje e ganhe + 2 meses grátis

Continue sua jornada tech com ainda mais tempo para aprender e evoluir

Quero aproveitar agora
1 resposta

Hola Ana, ¿cómo estás? 😊

¡Excelente trabajo en la creación de los procedimientos y el cursor! 👍

Tu código está bien estructurado y cumple con el objetivo de separar los datos y listarlos.

Aquí te dejo algunos puntos que podrían ayudarte a mejorar aún más tu código:

  • Manejo de errores: Considera agregar manejo de errores para casos donde las listas de nombres y correos electrónicos tengan longitudes diferentes. 🤔
  • Optimización del cursor: Para grandes conjuntos de datos, el uso de cursores puede ser ineficiente. Explora alternativas como el uso de tablas temporales y operaciones de conjunto.
  • Limpieza: Puedes incluir un DROP TEMPORARY TABLE IF EXISTS temp_nomes; al principio de tu script para asegurar que la tabla temporal se elimina antes de ser recreada.

🎓 Para saber más:

¡Sigue practicando y explorando las posibilidades de SQL! 🧐