Ejercicios de MySQL con Cursores

1. Función que pasándole un salario me devuelva cuantos empleados cobran menos de ese salario mostrar también el nombre y el salario de dichos empleados.

 

Delimiter $$

drop function if exists ej_cursor2$$

create function ej_cursor2(tope float) returns int

begin

declare done int default false;

declare salario float;

declare numero_empleados int default 0;

declare cursor2 cursor for select salEmp from empleados;

declare continue handler for not found set done=TRUE;

 

open cursor2;

 

bucle:LOOP

            fetch cursor2 into salario;

    

    if done=TRUE then

                        leave bucle;

            end if;

    

    if salario<tope then 

                        set numero_empleados=numero_empleados+1;

            end if;

end loop;

 

close cursor2;

 

 

return numero_empleados;

end

$$

 

 

2. Desarrollar un procedimiento que visualice el apellido y la fecha de alta de todos los empleados ordenados por apellido.

 

Delimiter $$

Drop procedure if exists cursor01 $$

Create procedure cursor01()

begin

declare done int default false;

declare fecha_incorporacion date;

declare nombre varchar (30);

declare curs cursor for select nomEmp,fecIncorporacion from empleados

order by nomEmp;

declare continue handler for not found set done=true;

 

open curs;

bucle:loop

fetch curs into nombre,fecha_incorporacion;

select nombre,fecha_incorporacion;

if done then

 

leave bucle;

end if;

end loop bucle;

close curs;

end

$$

 

3. Codificar un procedimiento que muestre el nombre de cada departamento y el número de empleados que tiene.

 

Delimiter $$

drop procedure if exists cursor02 $$

create procedure cursor02()

begin

declare done int default false;

declare Departamento varchar (20);

declare Numero_Empleados int;

declare curs cursor for select d.nombreDpto,count(*) from departamentos as d

inner join empleados as e

on d. codDepto=e.codDepto

group by d.nombreDpto;

declare continue handler for not found set done=true;

 

open curs;

bucle:loop

fetch curs into Departamento,Numero_Empleados;

if done then

leave bucle;

end if;

select Departamento,Numero_Empleados;

 

end loop bucle;

close curs;

end

$$

 

4. Escribir un procedimiento que reciba una cadena y visualice el apellido y el número de empleado de todos los empleados cuyo apellido contenga la cadena especificada. Al finalizar visualizar el número de empleados mostrados.

 

Delimiter $$

 

Drop procedure if exists cursor03$$

create procedure cursor03(in cadena varchar (30))

begin

declare done int default false;

declare Nombre_Empleado varchar (30);

declare contador int default 0;

declare curs cursor for select nomEmp from empleados

where lower(nomEmp) like concat(&quot;%”, cadena,&quot;%&quot;);

declare continue handler for not found set done=true;

 

open curs;

bucle:loop

fetch curs into Nombre_Empleado;

if done then

 

leave bucle;

end if;

 

select Nombre_Empleado;

set contador=contador +1;

end loop bucle;

select contador;

close curs;

 

end

$$

 

5. Escribir un programa que visualice el apellido y el salario de los cinco empleados que tienen el salario más alto.

 

Delimiter $$

Drop procedure if exists cursor04$$

create procedure cursor04 ()

begin

declare done int default false;

declare nombre varchar (30);

declare salario float;

declare curs cursor for select nomEmp,salEmp from empleados

order by salEmp desc

limit 5;

declare continue handler for not found set done=true;

 

open curs;

bucle:loop

fetch curs into nombre,salario;

if done then

leave bucle;

end if;

select nombre,salario;

 

end loop bucle;

close curs;

end

 

$$

 

6. Codificar un programa que visualice los dos empleados que ganan menos de cada oficio.

 

CREATE DEFINER=`root`@`localhost` PROCEDURE `tarea4_05B`()

BEGIN

DECLARE done INT DEFAULT FALSE;

DECLARE nom varchar(20);

DECLARE sal FLOAT;

DECLARE ofi varchar(15);

DECLARE ofi_ant varchar(15);

DECLARE cont int default 0;

DECLARE cursor05 CURSOR FOR

Select nomemp, salemp, cargoe

From empleados ORDER BY cargoe asc, salemp asc;

 

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

OPEN cursor05;

Set ofi_ant="*";

 

Bucle: LOOP

FETCH cursor05 INTO nom,sal,ofi;

 

IF done=TRUE THEN

LEAVE bucle;

END IF;

 

If ofi_ant&lt;&gt;ofi then

Set ofi_ant=ofi;

Set cont=0;

Else

Set cont=cont+1;

End if;

 

If cont<3 then

 

Select nom,sal,ofi;

End if;

 

Set cont=cont +1;

 

END LOOP;

Close cursor05;

END

 

7. Escribir un programa que muestre Para cada departamento: Número de empleados y suma de los salarios del departamento. Al final del listado: Número total de empleados y suma de todos los salarios.

 

delimiter $$

drop procedure if exists cursor06 $$

create procedure cursor06()

begin

declare done int default false;

declare Departamento varchar(20);

declare numero_empleados int;

declare Salario_total_departamento float;

declare Salario_total float default 0.0;

declare Total_empleados int default 0;

declare curs cursor for select d.nombreDpto,count(e.nDIEmp),sum(e.salEmp)

from empleados as e

inner join departamentos as d

on e.codDepto=d.codDepto

group by d.nombreDpto;

 

declare continue handler for not found set done=true;

 

open curs;

bucle:loop

fetch curs into

Departamento,numero_empleados,Salario_total_departamento;

 

if done then

leave bucle;

end if;

 

select Departamento,numero_empleados,Salario_total_departamento;

set Total_empleados=Total_empleados+numero_empleados;

set Salario_total=Salario_total+Salario_total_departamento;

 

end loop bucle;

select Total_empleados ,Salario_total;

 

close curs;

 

end

$$

 

JARDINERÍA

 

8. Crear un procedimiento que muestre los clientes poniendo:

- Si han hecho pagos la suma total de los mismos.

- Si no han hecho pagos poner "SIN PAGOS";

 

Al final mostrar el total de pagos de todos los clientes.

 

Delimiter $$

Drop procedure if exists Jardineria06

create procedure Jardineria06()

begin

Declare done int default false;

Declare cliente varchar (50);

Declare pago float;

Declare informe_pago varchar (30);

Declare total_pagos float default 0.0;

Declare curs cursor for select c.nombre_cliente,sum(p.total) from cliente as c

left join pago as p

On c.codigo_cliente=p.codigo_cliente

Group by c.nombre_cliente;

Declare continue handler for not found set done=true;

 

Open curs;

bucle:loop

fetch curs into cliente,pago;

if done then

leave bucle;

end if;

if pago is null then

set informe_pago="sin pago";

select cliente,pago,informe_pago;

else

select cliente,pago,informe_pago;

set total_pagos= total_pagos + pago;

end if;

 

end loop bucle;

Close curs;

 

Select total_pagos;

End

$$

 

9. Crear un procedimiento que muestre las distintas gamas de productos con la cantidad de unidades vendidas de cada gama. Si no supera cierta cantidad (parámetro del procedimiento) se muestra "POCO

VENDIDA";

 

al final se muestra el número de gamas poco vendidas gamas.

 

Delimiter $$

Drop procedure if exists jardineria07 $$

Create procedure jardineria07(in cantidad int)

Begin

Declare done int default false;

Declare nombre_gama varchar (50);

Declare unidades_vendidas int;

Declare informe varchar (50);

Declare curs cursor for select g.gama,sum(d.cantidad) from producto as p inner

join gama_producto as g

On p.gama=g.gama

Inner join detalle_pedido as d

On d.codigo_producto=p.codigo_producto

Group by g.gama;

Declare continue handler for not found set done=true;

 

Open curs;

bucle:loop

fetch curs into nombre_gama,unidades_vendidas;

 

if done then

 

leave bucle;

end if;

 

if unidades_vendidas<=cantidad then

set informe="poco vendida";

 

select nombre_gama,unidades_vendidas,informe;

end if;

end loop bucle;

 

close curs;

End

 

$$

 

No hay comentarios:

Publicar un comentario

Configurar NAS LACIE y probar que podemos acceder a él en la red interna

El modelo de NAS que hemos utilizado es el LACIE 5big. Una de las cosas que debemos tener en cuenta es: - En la red hay un servidor DHCP...