Práctica 3 del tema 6/7. Se utilizan las tablas de la base de datos primeros_pasos.

Ejercicio 19: Listar empleados por rango de departamento

Procedimiento que recibe dos valores y muestra los datos de los empleados cuyos departamentos están en ese rango:

drop procedure if exists diecinueve;
delimiter $$
create procedure diecinueve(in min integer, in max integer)
begin
     declare ultimaFila integer default 0;
     declare vNumde integer;
     declare vSalario integer;
     declare vComision integer;
     declare vNomem varchar(18);
     declare cEmpleados cursor for
         select nomem, numde, salario, comision
         from empleados
         where numde between min and max;
     declare continue handler for not found set ultimaFila = 1;
     open cEmpleados;
         empleadosCursor: loop
              fetch cEmpleados into vNomem, vNumde, vSalario, vComision;
              if ultimaFila = 1 then
                   leave empleadosCursor;
              end if;
              select vNomem as 'Empleado', vNumde as 'Departamento',
                     vSalario as 'Salario', vComision as 'Comision',
                     vSalario+ifnull(vComision,0) as 'Salario total';
         end loop empleadosCursor;
     close cEmpleados;
end $$
delimiter ;

Ejercicio 20: Subida de sueldo a empleados por debajo de la media de su oficio

Procedimiento que sube el sueldo de los empleados que ganan menos que el promedio de su oficio. La subida equivale al 50% de la diferencia entre su salario y la media, dentro de una transacción:

delimiter $$
drop procedure if exists veinte $$
create procedure veinte()
begin
     declare sentencia varchar(255);
     declare ultimaFila int default 0;
     declare empleado int;
     declare vOficio varchar(255);
     declare vSalario int;
     declare salarioMedio int;
     declare subida int;
     declare cEmp cursor for
         select emp_no, oficio, salario
         from empleados e
         where salario < (select avg(salario) from empleados
                          where oficio = e.oficio)
         for update;
     declare continue handler for not found set ultimaFila = 1;
     start transaction;
         open cEmp;
              cursorEmpleados: loop
                   fetch cEmp into empleado, vOficio, vSalario;
                   if ultimaFila = 1 then
                        leave cursorEmpleados;
                   end if;
                   set salarioMedio = (select avg(salario) from empleados
                                      where oficio = vOficio);
                   set subida = (salarioMedio - vSalario) / 2;
                   update empleados set salario = salario + subida
                          where emp_no = empleado;
              end loop cursorEmpleados;
         close cEmp;
     commit;
end $$
delimiter ;