Dos errores de sintaxis y uno de proceso:
1. No declaraste la variable DONE. Debe ser declarada e inicializada a cero.
2. El END IF lleva cierre de sentencia porque es una estructura.
El error de proceso se verá cuando lo corras: Si estás haciendo un FETCH de una tabla implica que la estás
leyendo, por lo tanto no puedes
escribirle nada. Tiene en ese momento un bloqueo de escritura a nivel de tabla, entre otras cosas porque MySQL no puede saber si lo que vas a modificar no va a afectar el filtro que estás usando para seleccionar.
Me explico: Si el WHERE busca el valor X en un campo, obtiene un conjunto de registros, pero si la misma acción lo modifica a ese campo ¿cómo puede estar leyéndolo si ya no cumple con la condición de filtro? ¿En qué estado se encuentra, lo lee o no? Es un problema de consistencia. Por eso no se permiten escrituras de una tabla en proceso de lectura.
Tienes que crear una tabla intermedia y luego usar esa tabla para actualizar la MUNICIPIOS.
El código quedaría:
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;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
OPEN C1;
REPEAT
FETCH C1 INTO PROVINCIA, MUNICIPIO;
IF NOT DONE THEN
UPDATE `municipios`
SET C_MUNICIPIO=PROVINCIA & MUNICIPIO
WHERE C_PROVINCIA=PROVINCIA AND C_MUNICIPIO=MUNICIPIO;
END IF;
UNTIL DONE END REPEAT;
END $$
DELIMITER ;