Clase 22: Solución a ej. de rutinas almacenadas.
01/09/2021 —
Juanse Marquez
Les dejo una solución propuesta a los ejercicios que habíamos trabajado en clases anteriores.
-- 1) Crear un procedimiento que, utilizando un cursor, recorra las operaciones
-- cuya fecha de venta sea anterior a la fecha de alta, cambiando en esos casos
-- la fecha de alta para que sea igual a la fecha de venta. (Para poder probar
-- el procedimiento, puede ser necesario agregar antes algunas operaciones).
DELIMITER $$CREATE PROCEDURE anula_fv_anteriores_al_alta()
BEGIN
DECLARE contador INT DEFAULT 0;
DECLARE id_var INT;
DECLARE ultima_fila BOOLEAN DEFAULT FALSE;
DECLARE cursor_operaciones cursor FOR
SELECT id FROM operaciones WHERE fecha_venta < alta;
DECLARE continue HANDLER FOR NOT FOUND
SET ultima_fila = TRUE;
OPEN cursor_operaciones;
INTO id_var;
FETCH cursor_operaciones WHILE ultima_fila = FALSE DO
UPDATE operaciones SET fecha_venta = NULL WHERE id = id_var;
SET contador = contador + 1;
INTO id_var;
FETCH cursor_operaciones END WHILE;
SELECT
CONCAT('Se definieron como nulas ', contador,
' fechas de venta que eran anteriores a la fecha de alta') AS resultado;
END$$
DELIMITER ;
-- Para probarlo:
CALL anula_fv_anteriores_al_alta();
-- 2) Hacer un disparador para que, cada vez que se agregue una nueva operación,
-- realice el mismo cambio que en el ejercicio anterior.
DELIMITER $$CREATE TRIGGER anula_fv_anterior_al_alta
BEFORE INSERT ON operaciones
FOR EACH ROW
BEGIN
IF NEW.fecha_venta < NEW.alta THEN
SET NEW.fecha_venta = NULL;
END IF;
END$$
DELIMITER ;
-- 3) Crear una nueva tabla llamada ex_vendedores, que tenga las mismas columnas
-- que la tabla vendedores. Puede hacerse con el siguiente código:
-- CREATE TABLE ex_vendedores LIKE vendedores;
-- Crear un disparador para que cada vez que se elimine un vendedor de la tabla
-- vendedores, se agreguen sus datos a la tabla ex_vendedores.
DELIMITER $$CREATE TRIGGER agrega_ex_vendedor
AFTER DELETE ON `vendedores`
FOR EACH ROW
BEGIN
INSERT INTO ex_vendedores
VALUES (OLD.id_vendedor, OLD.nombre, OLD.apellido);
END$$
DELIMITER ;
-- 4) Crear un disparador para que evite que se pueda agregar una operación de
-- tipo "Venta" cuyo precio de venta sea menor a $100.000
DELIMITER $$CREATE TRIGGER prohibe_venta_barata
BEFORE INSERT ON operaciones
FOR EACH ROW
BEGIN
IF NEW.precio_venta < 100000 AND NEW.id_tipo_operacion = 2 THEN
'45000'
SIGNAL SQLSTATE SET MESSAGE_TEXT = "No se puede vender por menos de $100000";
END IF;
END$$
DELIMITER ;
-- Para probarlo:
INSERT INTO operaciones
(alta, superficie, precio_venta, fecha_venta, id_tipo_propiedad,
id_tipo_operacion, id_provincia, id_vendedor) VALUES (CURDATE(), 222, 1, CURDATE(), 1, 2, 1, 18);
-- Responde:
-- ERROR 1644 (45000): No se puede vender por menos de $100000
-- 5) Probar iniciar una transacción, realizar varios cambios a alguna tabla,
-- y luego deshacer los cambios realizados.
START TRANSACTION;
-- ... varios cambios ...
ROLLBACK;
-- 6)Probar iniciar una transacción, realizar varios cambios a alguna tabla, y
-- luego confirmar los cambios realizados.
START TRANSACTION;
-- ... varios cambios ...
COMMIT;
Etiquetas: clases, ejercicios, soluciones