Ver Mensaje Individual
  #2 (permalink)  
Antiguo 18/03/2009, 06:20
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Ayuda para crear un procedimiento

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 original
  1. DELIMITER $$
  2.  
  3. DROP PROCEDURE IF EXISTS `C_MUNICIPIOS` $$
  4. CREATE PROCEDURE `C_MUNICIPIOS`()
  5. NOT DETERMINISTIC
  6. SQL SECURITY DEFINER
  7. COMMENT ''
  8. BEGIN
  9.   DECLARE PROVINCIA VARCHAR(5);
  10.   DECLARE MUNICIPIO VARCHAR(5);
  11.   DECLARE DONE INT DEFAULT 0;
  12.   DECLARE C1 CURSOR FOR SELECT C_PROVINCIA, C_MUNICIPIO FROM MUNICIPIOS;
  13.   DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
  14.   OPEN C1;
  15.   REPEAT
  16.     FETCH C1 INTO PROVINCIA, MUNICIPIO;
  17.     IF NOT DONE THEN
  18.       UPDATE `municipios`
  19.       SET C_MUNICIPIO=PROVINCIA & MUNICIPIO
  20.       WHERE C_PROVINCIA=PROVINCIA AND C_MUNICIPIO=MUNICIPIO;
  21.     END IF;
  22.   UNTIL DONE END REPEAT;
  23. END $$
  24.  
  25. DELIMITER ;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)