No me quería alejar de la explicación, por lo que simplemente modifiqué lo que ya habías hecho.
En realidad, para mantener el ejemplo dentro de lo ya escrito, la cosa sería mas o menos así:
Código sql:
Ver originalDELIMITER $$
DROP PROCEDURE IF EXISTS `C_MUNICIPIOS` $$
CREATE PROCEDURE `C_MUNICIPIOS`()
NOT DETERMINISTIC
SQL SECURITY DEFINER
COMMENT ''
BEGIN
DECLARE PROVINCIA VARCHAR(5);
DECLARE MUNICIPIO VARCHAR(5);
DECLARE DONE INT DEFAULT 0;
DECLARE C1 CURSOR FOR SELECT C_PROVINCIA, C_MUNICIPIO FROM MUNICIPIOS_TEMP;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
/*Borra la tabla temporal si existe*/
DROP TABLE IF EXISTS MUNICIPIOS_TEMP;
/* Crea la tabla nuevamente con el contenido necesario */
CREATE TABLE MUNICIPIOS_TEMP AS
SELECT C_PROVINCIA, C_MUNICIPIO FROM MUNICIPIOS;
OPEN C1;
REPEAT
FETCH C1 INTO PROVINCIA, MUNICIPIO;
IF NOT DONE THEN
UPDATE `municipios`
SET C_MUNICIPIO=CONCAT(PROVINCIA,MUNICIPIO)
WHERE C_PROVINCIA=PROVINCIA AND C_MUNICIPIO=MUNICIPIO;
END IF;
UNTIL DONE END REPEAT;
CLOSE C1;
/*Borra la tabla temporal*/
DROP TABLE IF EXISTS MUNICIPIOS_TEMP;
END $$
DELIMITER ;
Eso debería ser suficiente. Como el cursor pasa a ser sinónimo de la sentencia, y comienza a operar recién al ser abierto, ya no está leyendo la tabla origen, sino la recién creada.
Notas:
1. No te olvides de cerrar el cursor para poder borrar la tabla. Los cursores no deben permanecer abiertos si no los necesitas más.
2. La sentencia DELIMITER sirve para cambiar momentáneamente el fin del sentencia para poder cargar el SP por conosola, o bien en una interfaz del tipo MySQL Query Browser.