DROP PROCEDURE IF EXISTS `vn`.`zone_getPostalCode`;

DELIMITER $$
$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `vn`.`zone_getPostalCode`(vSelf INT)
BEGIN
/**
 * Devuelve los códigos postales incluidos en una zona
 */ 
    DECLARE vGeoFk INT DEFAULT NULL;

    DROP TEMPORARY TABLE IF EXISTS tmp.zoneNodes;
    CREATE TEMPORARY TABLE tmp.zoneNodes (
            geoFk INT,
            name VARCHAR(100),
            parentFk INT,
            sons INT,
            isChecked BOOL DEFAULT 0,
            zoneFk INT,
            PRIMARY KEY zoneNodesPk (zoneFk, geoFk),
            INDEX(geoFk))
            ENGINE = MEMORY;

    CALL zone_getLeaves2(vSelf, NULL , NULL);

       UPDATE tmp.zoneNodes zn
           SET isChecked = 0
       WHERE parentFk IS NULL;

        myLoop: LOOP    
            SET vGeoFk = NULL;
            SELECT geoFk INTO vGeoFk 
                FROM tmp.zoneNodes zn
                WHERE NOT isChecked
                LIMIT 1;

            CALL zone_getLeaves2(vSelf, vGeoFk, NULL);
            UPDATE tmp.zoneNodes
                SET isChecked = TRUE 
                WHERE geoFk = vGeoFk;

            IF vGeoFk IS NULL THEN
                LEAVE myLoop;
            END IF;
        END LOOP;

    DELETE FROM tmp.zoneNodes 
        WHERE sons > 0;

        SELECT zn.geoFk, zn.name
            FROM tmp.zoneNodes zn
                JOIN zone z ON z.id = zn.zoneFk;
END$$
DELIMITER ;