Está en la página 1de 5

PREGUNTAS 1 2 3 4 5 6 7 8 NOTA

PUNTOS 0,5 0,5 1 2 1 1 2 2

PUNTUACIÓN

Tarea 6

Base de datos Talleres Faber

1.- Crear un procedimiento que muestre los vehículos (marca, modelo y color) que no estén
reparados y los datos de los clientes y vehículos que han entrado a reparar hoy. (En nuestro
caso ninguno).
CREATE PROCEDURE `vehiculos_reparacion_hoy`()
BEGIN
SELECT marca, modelo, color, curdate()
FROM VEHICULOS v JOIN REPARACIONES r ON(v.matricula=r.matricula)
WHERE reparado = 0;

SELECT dni, nombre, apellidos, v.matricula, modelo


FROM CLIENTES c JOIN VEHICULOS v ON (v.codCliente = c.codCliente)
JOIN REPARACIONES r ON(v.matricula=r.matricula)
WHERE FechaEntrada = curdate();

END

2.- Crear una función que actualice el estado de las reparaciones que estén finalizadas en una
fecha que se indique y que devuelva cuantas reparaciones han finalizado en esa fecha.
CREATE FUNCTION `actualizar_reparaciones`(fecha date) RETURNS int(11)
BEGIN
DECLARE ultima_fila INT DEFAULT 0;
DECLARE num INT(5);
DECLARE id INT(11);
DECLARE repa tinyint(1);
DECLARE fech_sal DATE;
DECLARE cRep CURSOR FOR
SELECT IdReparacion, FechaSalida, Reparado
FROM REPARACIONES
WHERE FechaSalida IS NOT NULL AND Reparado=0;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET ultima_fila=1;
OPEN cRep;
SET num = 0;
rep: LOOP
FETCH cRep INTO id,fech_sal, repa;
IF (ultima_fila=1) THEN
LEAVE rep;
END IF;

UPDATE REPARACIONES SET Reparado = 1


WHERE idReparacion = id;
SET num = num +1;
END LOOP rep;

RETURN num;
END

-comprobación

select actualizar_reparaciones('2011-01-08');
3.-Un procedimiento que muestre un listado con dos columnas: en la primera, en mayúsculas
apellidos y nombre de todos los clientes (entre los apellidos y el nombre incluir una coma como
separador) y en la segunda, la ciudad en la que cada cliente tiene su domicilio (únicamente la
ciudad, no la dirección).
NOTA: utilicen la siguiente expresión para extraer la ciudad

SUBSTRING_INDEX(Direccion, ',' , -1) AS CIUDAD

CREATE PROCEDURE `listado_clientes_ciudad`()


BEGIN
SELECT ucase(concat(concat(nombre, ', '),apellidos)) "CLIENTE",
SUBSTRING_INDEX(Direccion, ',' , -1) "CIUDAD"
FROM CLIENTES;
END

4.- Creación de funciones:

a) Diseña una función que calcule el importe de los recambios sustituidos en una reparación.
CREATE FUNCTION `ImporteRecambios`(IdRep INT) RETURNS float
BEGIN
DECLARE Resultado FLOAT Default 0;
SELECT SUM(Unidades*PrecioReferencia) INTO Resultado
FROM Incluyen INNER JOIN RECAMBIOS REC ON REC.IdRecambio = Incluyen.IdRecambio
WHERE Incluyen.IdReparacion = IdRep;
RETURN Resultado;
END

b) Crear una función que devuelva el importe de las actuaciones que se llevan a cabo en una
reparación (para calcular el importe dividimos el importe de la actuación entre el tiempo
estimado para calcular el precio de la hora. Luego multiplicamos por las horas reales).

En ambas funciones Pasar como variable el Id de la reparación.


CREATE FUNCTION `ImporteActuaciones`(IdRep INT) RETURNS float
BEGIN
DECLARE Resultado FLOAT Default 0;
SELECT SUM((Importe/TiempoEstimado)*horas) INTO Resultado
FROM ACTUACIONES a INNER JOIN Realizan r ON (a.Referencia = r.referencia)
WHERE IdReparacion = IdRep;
RETURN Resultado;
END

c) Hacer una consulta que calcule el importe total (mano de obra y recambios) de las
reparaciones que se le hayan realizado al vehículo de matrícula '1313 DEF'.

SELECT IdReparacion, ROUND(ImporteRecambios(IdReparacion)+ImporteActuaciones(IdReparacion),2) as IMPORTE


FROM REPARACIONES WHERE Matricula='1313 DEF';
Base de datos Historial Laboral

5.- Crear un procedimiento que realice un listado con los nombres y fechas, de todos los empleados
y departamentos por los que ha pasado ordenado por fecha. Realizar la comprobación.
CREATE PROCEDURE `historial_empleados`()
begin
SELECT nombre, apellido1, apellido2, fecha_inicio, nombre_dpto
FROM EMPLEADOS E JOIN HISTORIAL_LABORAL H ON (E.dni= H.empleado_dni)
JOIN DEPARTAMENTOS D ON(H.dpto_cod = D.dpto_cod)
ORDER BY fecha_inicio;
end;

-comprobación

call list_empleados_departementos();

6.- Crear un procedimiento que actualice los estudios de un empleado (pasando como parámetros el
dni del empleado, nombre de la universidad, año, grado y especialidad). En caso de error enviar un
mensaje SIGNAL.
CREATE PROCEDURE `actualizar_estudios`(
in dni int
, in uni int
, in año int
, in grado varchar(5)
, in espe varchar(20)
)
begin

if (año > YEAR(curdate()))


then
signal sqlstate '45000'
set message_text = 'Año de estudios incorrecto';
else
insert into estudios values(dni,uni,año,grado, espe);

end if;
end;

7.- Tabla de cambios datos empleados y trigger:


a) Crear una nueva tabla de nombre CambiosEmpleados en la que se almacenarán los datos
antiguos de un empleado cada vez que se hagan cambios. Sólo serán necesarias las
siguientes columnas:
• dni
• direcc1
• ciudad
• fechamod

create table CambiosEmpleados (
dni number(8) not null,
direcc1 varchar(25) not null,
ciudad varchar(20) not null,
fechamod date not null,
constraint pk_cambiosempleados primary key (dni,fechamod)
);
b) Crear un trigger que se dispare cada vez que se haga una actualización de los datos de un
empleado (a excepción del salario), se deben copiar los datos antiguos (dni, direcc1, ciudad)
más la fecha actual a la tabla CambiosEmpleados.

USE HistorialEmpleados;
DROP TRIGGER IF EXISTS update_empleados;
DELIMITER $$
create trigger update_empleados
after update on EMPLEADOS for each row
begin
if new.salario = old.salario then
insert into CambiosEmpleados
values (old.dni,old.direcc1,old.ciudad, curdate());
end if;
end $$
DELIMITER ;

c) Realiza la comprobación.

update EMPLEADOS set direcc1= 'Av. de los pricipes, 5 '


where dni= 12345;

8.- Trigger y procedimiento:


a) Crear un procedimiento para cambiar a un empleado de departamento (pasados como
parámetros el DNI del empleado, código del puesto de trabajo, fecha de inicio, el nombre
del departamento y el dni del supervisor).
CREATE PROCEDURE `cambio_departamento`(
in dni int,
in cod_puesto int,
in fech_ini date,
in nom_dept varchar(30),
in dni_su int)
begin
declare cod_dept int;
declare dni_busq;

select empleado_dni into dni_busq


from HISTORIAL_LABORAL
where empleado_dni = dni
and fecha_fin is null;

if dni_busq IS NOT NULL then


update HISTORIAL_LABORAL set fecha_fin = fech_ini
where empleado_dni = dni
and fecha_fin is null;
end if;

select dpto_cod into cod_dept


from DEPARTAMENTOS
where nombre_dpto=nom_dept;

insert into HISTORIAL_LABORAL


values(dni,cod_puesto,fech_ini,null,cod_dept,dni_su);
end;

-- comprobación
Nota: Debe existir el departamento de VENTAS
call cambio_departamento(12345,1,'2018/01/01', 'VENTAS', 22222);
b) Crear un trigger para que cuando un empleado cambie de puesto actualice
automáticamente su historial laboral (fecha de finalización en su anterior departamento).
Realizar la comprobación con el procedimiento anterior.
NOTA: Este apartado no es posible realizarlo en MySQL. Lo realizaremos en el apartado a).

También podría gustarte