Cursores

Manejo de cursores en MySQL

Programación de Bases de Datos (6.6.- Cursores en MySQL)

Cursores en MariaDB/MySQL

Crear un procedimiento que muestre los nombres y salarios de los empleados con un salario superior a uno dado

Solución?

 

Lista de nombres de empleados que son jefes en la base de datos de proyectos:

DELIMITER $$
CREATE FUNCTION ListadoEmpleados()
RETURNS VARCHAR(500)

BEGIN
    /*Declaración de variables*/
    DECLARE ultima_fila INT DEFAULT 0;
    DECLARE texto_nombre VARCHAR(50) default '';
    DECLARE resultado VARCHAR(500) default '';
    
    /*Declaración del cursor*/
    DECLARE mi_cursor CURSOR FOR
      SELECT distinct j.nombre 
      FROM empleado e, empleado j
      WHERE e.cdjefe = j.cdemp;
    
    /*Declaración del manipulador de error*/   
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET ultima_fila=1;
    
    /*Abrimos el cursor*/
    OPEN mi_cursor;
    /* Creamos un bucle para recorrer el mi_cursor */
    bucle: LOOP
        /*Cogemos el primer nombre de jefe en la varible*/
        FETCH mi_cursor INTO texto_nombre;

        /*Comprobamos si es la última fila para salir del bucle*/
        IF (ultima_fila = 1) THEN
             LEAVE bucle;
        END IF; 

          /*Vamos concatenando los nombres de los jefes en la variable resultado*/     
         IF resultado = '' THEN
             SET resultado = (texto_nombre);
         ELSE
             SET resultado = CONCAT(resultado ,', ' ,(texto_nombre));
         END IF;

    END LOOP bucle;

    /*Cerramos el cursor*/
    CLOSE mi_cursor;

    /*Devolvemos la variable de la función*/
    RETURN resultado;
END
$$

DELIMITER ;

Ejecución:

SELECT ListadoEmpleados();

 

Cursors

DELIMITER $$

CREATE PROCEDURE create_email_list (
    INOUT email_list TEXT
)
BEGIN
    DECLARE done BOOL DEFAULT false;
    DECLARE email_address VARCHAR(100) DEFAULT "";
    
    -- declare cursor for employee email
    DECLARE cur CURSOR FOR SELECT email FROM employees;

    -- declare NOT FOUND handler
    DECLARE CONTINUE HANDLER 
        FOR NOT FOUND SET done = true;
    
    SET email_list = '';

    -- open the cursor
    OPEN cur;
    
    REPEAT
        
        FETCH cur INTO email_address;
        
        IF NOT done THEN
            -- concatenate the email into the emailList
            SET email_list = CONCAT(email_address,"; ",email_list);
        END IF;

        UNTIL done

    END REPEAT;
    
    -- close the cursor
    CLOSE cur;

END
$$

DELIMITER ;

Ejecución

CALL create_email_list (@list);
SELECT @list;

Otra forma de obtener los emails:

DELIMITER $$
CREATE OR REPLACE PROCEDURE listaEmails()
BEGIN
    DECLARE _lista TEXT DEFAULT '';
    FOR _fila IN (SELECT * FROM employees where email IS NOT NULL)
        DO SET _lista := CONCAT (_lista, ', ', _fila.email);
    END FOR;
    SELECT _lista as EMails;
END
$$

DELIMITER ;

Ejecución:

CALL listaEmails();

Ejemplo de cursores

Deja una respuesta