Bases de Datos II

3º2ª DS

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;
FETCH cursor_operaciones INTO id_var;
WHILE ultima_fila = FALSE DO
    UPDATE operaciones SET fecha_venta = NULL WHERE id = id_var;
    SET contador = contador + 1;
    FETCH cursor_operaciones INTO id_var;
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
  SIGNAL SQLSTATE '45000'
  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