/*
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 );