60 lines
1.4 KiB
MySQL
60 lines
1.4 KiB
MySQL
|
DROP procedure IF EXISTS `zoneNestTown`;
|
||
|
|
||
|
DELIMITER $$
|
||
|
CREATE DEFINER=`root`@`%` PROCEDURE `vn`.`zoneNestTown`()
|
||
|
BEGIN
|
||
|
|
||
|
DECLARE vDone BOOL;
|
||
|
DECLARE vParent INT DEFAULT 1;
|
||
|
DECLARE vGeoFk INT;
|
||
|
DECLARE vChildFk INT;
|
||
|
DECLARE vChildName VARCHAR(100);
|
||
|
DECLARE townCur CURSOR FOR
|
||
|
SELECT p.geoFk, t.id, t.`name`
|
||
|
FROM vn.town t
|
||
|
JOIN vn.province p ON p.id = t.provinceFk
|
||
|
JOIN tmp.country tc ON tc.id = p.countryFk
|
||
|
ORDER BY p.geoFk, t.`name`;
|
||
|
|
||
|
DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
|
||
|
|
||
|
-- Remove existing towns from zoneGeo
|
||
|
DELETE zg FROM vn.town t
|
||
|
JOIN vn.province p ON p.id = t.provinceFk
|
||
|
JOIN tmp.country tc ON tc.id = p.countryFk
|
||
|
JOIN tmp.zoneGeo zg ON zg.id = t.geoFk;
|
||
|
|
||
|
-- Reset town geoFk
|
||
|
UPDATE vn.town t
|
||
|
JOIN vn.province p ON p.id = t.provinceFk
|
||
|
JOIN tmp.country tc ON tc.id = p.countryFk
|
||
|
SET t.geoFk = NULL
|
||
|
WHERE t.geoFk IS NOT NULL;
|
||
|
|
||
|
-- > Town cursor start
|
||
|
OPEN townCur;
|
||
|
|
||
|
townLoop: LOOP
|
||
|
SET vDone = FALSE;
|
||
|
|
||
|
FETCH townCur INTO vParent, vChildFk, vChildName;
|
||
|
|
||
|
IF vDone THEN
|
||
|
LEAVE townLoop;
|
||
|
END IF;
|
||
|
|
||
|
CALL nst.nodeAdd('tmp', 'zoneGeo', vParent, vChildName);
|
||
|
END LOOP;
|
||
|
CLOSE townCur;
|
||
|
-- < Town cursor end
|
||
|
|
||
|
UPDATE town t
|
||
|
JOIN tmp.zoneGeo z ON z.name = t.name
|
||
|
LEFT JOIN province p ON p.geoFk = z.id
|
||
|
SET t.geoFk = z.id
|
||
|
WHERE p.geoFk IS NULL;
|
||
|
END$$
|
||
|
|
||
|
DELIMITER ;
|
||
|
|