1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
/* Tablas Centros/Departamentos/Empleados (script primeros_pasos.sql) Ejercicio 19: Realiza un procedimiento que liste cada departamento junto con sus empleados de forma similar a cómo se ha hecho en el ejercicio cursor5 del apartado 6.2 del tema (en este último caso para centros junto con sus departamentos). Se listarán los datos de aquellos Departamentos cuyo número esté comprendido entre los dos números de departamento que se pasen como argumento al procedimiento. El formato y un ejemplo de ejecución (se han suprimido parte de la salida como los mensajes de filas devueltas): */ /* mysql> CALL ejercicio2_5(110,111); +-----------------------------------------+ | DATOS DEPARTAMENTO | +-----------------------------------------+ | Departamento: 110 - DIRECCION COMERCIAL | +-----------------------------------------+ +----------------------------------------------------------------------+ | DATOS EMPLEADO | +----------------------------------------------------------------------+ | Empleado: PEREZ, MARCOS-Salario: 480-Comision: 50 -Total sueldo: 530 | +----------------------------------------------------------------------+ +----------------------------------------------------------------------+ | DATOS EMPLEADO | +----------------------------------------------------------------------+ | Empleado: MORAN, CARMEN-Salario: 215-Comision: No -Total sueldo: 215 | +----------------------------------------------------------------------+ +-----------------------------------------------------------------------+ | DATOS EMPLEADO | +-----------------------------------------------------------------------+ | Empleado: CAMPOS, ROMULO-Salario: 200-Comision: No -Total sueldo: 200 | +-----------------------------------------------------------------------+ +----------------------------------+ | TOTALES DEPARTAMENTO | +----------------------------------+ | EMPLEADOS: 3 - TOTAL SUELDO: 945 | +----------------------------------+ +---------------------------------------+ | DATOS DEPARTAMENTO | +---------------------------------------+ | Departamento: 111 - SECTOR INDUSTRIAL | +---------------------------------------+ +------------------------------------------------------------------------+ | DATOS EMPLEADO | +------------------------------------------------------------------------+ | Empleado: AGUIRRE, AUREO-Salario: 310-Comision: 110 -Total sueldo: 420 | +------------------------------------------------------------------------+ ............ ............ +-----------------------------------+ | TOTALES DEPARTAMENTO | +-----------------------------------+ | EMPLEADOS: 8 - TOTAL SUELDO: 2475 | +-----------------------------------+ */ delimiter $$ drop procedure if exists 1x19 $$ create procedure 1x19( in inicio int, in fin int ) begin declare finCursor boolean default false; declare cueEmp int default 0; declare totSue double default 0; declare id, dep int; declare nom, ape tinytext; declare sal, com, tot double; -- Se crean dos Cursores, cada uno de ellos guarda la informacion que se necesitara despues: declare c_departamentos cursor for select dep_no, dnombre from departamentos where dep_no >= inicio && dep_no <= fin order by dep_no; declare c_empleados cursor for select dep_no, apellido, salario, if(comision is null, 0, comision) as comision, salario + if(comision is null, 0, comision) as total from empleados where dep_no >= inicio && dep_no <= fin order by dep_no; -- Automaticamente si ocurre un error de lectura en el Cursor, finCursor pasara a valer true. declare continue handler for not found set finCursor = true; -- Se abren los cursores: open c_departamentos; open c_empleados; -- Se lee el primer departamento y empleado: fetch c_departamentos into id, nom; fetch c_empleados into dep, ape, sal, com, tot; -- Recorre los departamentos: while finCursor = false do -- Se imprime el departamento. select concat('Departamento: ', id, ' - ', nom) as 'DATOS DEPARTAMENTO'; -- Si el departamento del empleado es el mismo que el del empleado se muestra y se lee un nuevo empleado: while id = dep && finCursor = false do set totSue = totSue + tot; -- Suma sueldos. select concat( 'Empleado: ', ape, ', Salario: ', sal, ', Comision: ', com, ', Total sueldo: ', tot ) as 'DATOS EMPLEADO'; fetch c_empleados into dep, ape, sal, com, tot; end while; fetch c_departamentos into id, nom; -- Se le un nuevo departamento. set cueEmp = cueEmp + 1; --Cuenta empleados. end while; -- Se cierran los cursores: close c_empleados; close c_departamentos; -- Se muestran los contadores: select concat( 'EMPLEADOS: ', cueEmp, ' - TOTAL SUELDO: ', truncate(totSue, 3) ) as 'TOTALES DEPARTAMENTO '; end $$ delimiter ; -- call 1x19( 20, 40 ); |