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

72 lines
1.7 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 vNextRoadmapId INT;
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
RESIGNAL;
END;
SET vDaysDiff = DATEDIFF(vDateToPaste, vDateToCopy);
IF vDaysDiff IS NULL OR NOT vDaysDiff THEN
CALL util.throw("No valid dates");
END IF;
START TRANSACTION;
SELECT AUTO_INCREMENT INTO vNextRoadmapId
FROM information_schema.tables
WHERE table_name = 'roadmap'
AND table_schema = 'vn';
CREATE OR REPLACE TEMPORARY TABLE tmp.roadmapsToCopy
ENGINE = MEMORY
SELECT ROW_NUMBER() OVER(ORDER BY id) rowOrder,
id,
`name`,
roadmapAddressFk,
etd,
eta,
observations,
price
FROM roadmap
WHERE etd BETWEEN vDateToCopy AND util.dayEnd(vDateToCopy);
INSERT INTO roadmap (`name`, roadmapAddressFk, etd, eta, observations, price)
SELECT `name`,
roadmapAddressFk,
etd + INTERVAL vDaysDiff DAY,
eta + INTERVAL vDaysDiff DAY,
observations,
price
FROM tmp.roadmapsToCopy;
INSERT INTO roadmapStop (roadmapFk, roadmapAddressFk, eta, `description`, bufferFk)
SELECT (rtc.rowOrder - 1) + vNextRoadmapId,
rs.roadmapAddressFk,
rs.eta + INTERVAL vDaysDiff DAY,
rs.description,
rs.bufferFk
FROM tmp.roadmapsToCopy rtc
JOIN roadmapStop rs ON rs.roadmapFk = rtc.id;
COMMIT;
DROP TEMPORARY TABLE tmp.roadmapsToCopy;
END$$
DELIMITER ;