Cursores
Manejo de cursores en MySQL
Programación de Bases de Datos (3.3 y 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?
Ejecución en consola
Ejecución en phpMyAdmin
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();
Deja una respuesta
Lo siento, debes estar conectado para publicar un comentario.