No es un bug, es una característica no documentada

martes, 17 de marzo de 2015

Bases de datos. SQL programado (VII). Ejercicios (II)

10:15 Posted by Inazio , No comments
Práctica 2 del tema 6/7

Para descargar el SQL con las tablas empleadas, pulse aquí

Ejercicio 9. Realizar un procedimiento que acepte un departamento como argumento y devuelva (visualice) todos los datos de los empleados que en él trabajan.

delimiter $$

drop procedure if exists nueve $$
create procedure nueve(dep varchar(255))
-- Pre: dep es cadena referenciando a nombre de departamento
-- Post: Muestra por pantalla los empleados de dicho departamento
begin
     select *
     from empleados
     where numde = (
         select numde
         from departamentos
         where nomde like dep
     );
end $$
delimiter ;

Ejercicio 10. Realizar un procedimiento que acepte un centro como argumento y devuelva (visualice)  todos los datos de los empleados que en él trabajan.

delimiter $$

drop procedure if exists diez $$
create procedure diez(centro varchar(255))
-- Pre: dep es cadena referenciando a nombre de departamento
-- Post: Muestra por pantalla los empleados de dicho departamento
begin
     select *
     from empleados
     where numde in (
         select numde
         from departamentos
         where numce = (
              select numce
              from centros
              where nomce like centro
         )
     );
end $$
delimiter ;

Ejercicio 11. Realizar un procedimiento que acepte un departamento y devuelva mediante dos parámetros de tipo OUT su  número de director (director) y presupuesto.

delimiter $$

drop procedure if exists once $$
create procedure once(departamento varchar(255), out director integer, out presupuesto integer)
-- Pre: departamento es cadena de caracteres que referencia a nombre de depno. director y presupuesto son enteros de salida
-- Post: Devuelve id de director y presupuesto de departamento
begin
     select direc, presu
     into director, presupuesto
     from departamentos
     where nomde like departamento;
end $$
delimiter ;

Ejercicio 12. Realizar un procedimiento que acepte dos cadenas: El nombre de una tabla y el de una columna y elimine la columna de la tabla.  No es necesario que el procedimiento controle antes si existe la tabla o columna.

delimiter $$

drop procedure if exists doce $$

create procedure doce(in tabla varchar(255), in columna varchar(255))
-- Pre: tabla y columna son cadenas de caracteres de máx 255
-- Post: Borra la columna de esa tabla

begin

     declare sentencia varchar(255);

     set @consulta = concat('alter table ',tabla,' drop column ',columna,';');
     prepare consulta from @consulta;
     execute consulta;
     deallocate prepare consulta;
end $$

delimiter ;

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

delimiter $$

drop procedure if exists trece $$
create procedure trece()
-- Pre:
-- Post: Muestra apellidos y fecha de alta de empleados ordenados por apellido
begin
     select nomem as 'APELLIDO', fecin as 'FECHA ALTA'
     from empleados
     order by 1;
end $$
delimiter ;

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

delimiter $$

drop procedure if exists catorce $$
create procedure catorce()
-- Pre:
-- Post: Muestra por pantalla nombre de departamento y cantidad de empleados que tiene
begin
     select nomde as 'DEPARTAMENTO', count(e.numde) as 'NUMERO DE EMPLEADOS'
     from empleados e, departamentos d
     where e.numde = d.numde
     group by nomde;
end $$
delimiter ;

Ejercicio 15. 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 quince $$

create procedure quince(in nombre varchar(255))

begin
    
     select numem, nomem
     from empleados
     where nomem like concat('%',nombre,'%');
    
     select count(*)
     from empleados
     where nomem like concat('%',nombre,'%');

end $$

delimiter ;

Ejercicio 16. 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 dieciseis $$

create procedure dieciseis()
-- Pre
-- Post: Muestra por pantalla nombre y salario de los 5 empleados con mayor salario

begin

     select nomem AS 'nombre', salario
     from empleados
     order by salario desc
     limit 5;
end $$

delimiter ;

Ejercicio 17. Desarrollar un procedimiento que permita insertar nuevos centros según las siguientes especificaciones:
-           Se pasará al procedimiento el nombre del departamento y la localidad.
-           El procedimiento insertará la fila nueva asignando como número de departamento la decena siguiente al número mayor de la  tabla.

delimiter $$

drop procedure if exists diecisiete $$

create procedure diecisiete(in nomCen varchar(255), in localCen varchar(255))
-- Pre: nomDep y localDep son cadenas de caracteres de máx 255
-- Post: Inserta nuevo departamento

begin

     declare numDep integer;
     select (numce+10)-(numce%10)
     into numDep
     from centros
     order by numce desc
     limit 1;

     insert into centros(numce, nomce, seas)
     values(numDep, nomCen, localCen);
end $$

delimiter ;

Ejercicio 18. Escribir un procedimiento que reciba todos los datos de un nuevo empleado y procese la transacción de alta gestionando posibles errores.

drop procedure if exists dieciocho;

delimiter $$

create procedure dieciocho(numem int(11), numde int(11), extel int(11), fecna date, fecin date, salario int(11), comision int(11), numhi int(11), nomem varchar(18))
begin
     declare valido int(1) default 1;
     declare controlErrores varchar(255);

     if numem is null then -- Si numero empleado nulo
         set valido = 0;
         set controlErrores = 'Número de empleado no puede ser nulo. ';
     end if;

     if numem in (select numem from empleados) then -- Si numero empleado repetido
         set valido = 0;
         set controlErrores = 'Número de empleado repetido';
     end if;

     if numde not in (select numde from departamentos) then -- Si numero de departamento no está en la tabla departamentos
         set valido = 0;
         set controlErrores = concat(controlErrores,'Número de director no está en tabla departamentos. ');
     end if;

     if datediff(now(),fecna) < 5840 then -- Si fecha de nacimiento < 16 años (edad laborar mínima en España)
         set valido = 0;
         set controlErrores = concat(controlErrores,'Empleados menores de 16 años es ilegal. ');
     end if;

     if datediff(fecin,fecna) <= 0 then -- Si fecha de alta laboral menor que fecha nacimiento
         set valido = 0;
         set controlErrores = concat(controlErrores,'La fecha de alta no puede ser menor que la de nacimiento');
     end if;

     if valido = 0 then -- Comprobación. Si valido = 0 muestro errores, si = 1 realizo inserción
         select controlErrores;
     else
         insert into empleados
          values (numem, numde, extel, fecna, fecin, salario, comision, numhi, nomem);
     end if; 
end $$
delimiter ;

0 comentarios:

Publicar un comentario