salix/db/routines/vn/procedures/roadmap_cloneDay.sql

73 lines
1.6 KiB
SQL

DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`roadmap_cloneDay`(
vDateToCopy DATE,
vDateToPaste DATE
)
BEGIN
/**
* Clona roadmaps de un día a otro, incluyendo las paradas y sin algunos
* campos de la tabla principal, como matrículas, conductores...
*
* @param vDateToCopy Fecha para copiar
* @param vDateToPaste Fecha para pegar
*/
DECLARE vDaysDiff INT;
DECLARE vRoadmapFk INT;
DECLARE vNewRoadmapFk INT;
DECLARE vDone BOOL DEFAULT FALSE;
DECLARE vRoadmaps CURSOR FOR
SELECT id
FROM roadmap
WHERE etd BETWEEN vDateToCopy AND util.dayEnd(vDateToCopy);
DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
RESIGNAL;
END;
SET vDaysDiff = DATEDIFF(vDateToPaste, vDateToCopy);
IF vDaysDiff IS NULL THEN
CALL util.throw("No valid dates");
END IF;
START TRANSACTION;
OPEN vRoadmaps;
l: LOOP
SET vDone = FALSE;
FETCH vRoadmaps INTO vRoadmapFk;
IF vDone THEN
LEAVE l;
END IF;
INSERT INTO roadmap (`name`, roadmapAddressFk, etd, eta, observations, price)
SELECT `name`,
roadmapAddressFk,
etd + INTERVAL vDaysDiff DAY,
eta + INTERVAL vDaysDiff DAY,
observations,
price
FROM roadmap
WHERE id = vRoadmapFk;
SET vNewRoadmapFk = LAST_INSERT_ID();
INSERT INTO roadmapStop (roadmapFk, roadmapAddressFk, eta, `description`, bufferFk)
SELECT vNewRoadmapFk,
roadmapAddressFk,
eta + INTERVAL vDaysDiff DAY,
`description`,
bufferFk
FROM roadmapStop
WHERE roadmapFk = vRoadmapFk;
END LOOP;
CLOSE vRoadmaps;
COMMIT;
END$$
DELIMITER ;