Ver Mensaje Individual
  #4 (permalink)  
Antiguo 19/03/2009, 05:54
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, 5 meses
Puntos: 2658
Respuesta: Ayuda para crear un procedimiento

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 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_TEMP;
  13.   DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
  14.  
  15.   /*Borra la tabla temporal si existe*/
  16.   DROP TABLE IF EXISTS MUNICIPIOS_TEMP;
  17.  
  18.   /* Crea la tabla nuevamente con el contenido necesario */
  19.   CREATE TABLE MUNICIPIOS_TEMP AS
  20.   SELECT C_PROVINCIA, C_MUNICIPIO FROM MUNICIPIOS;
  21.   OPEN C1;
  22.   REPEAT
  23.     FETCH C1 INTO PROVINCIA, MUNICIPIO;
  24.     IF NOT DONE THEN
  25.     UPDATE `municipios`
  26.       SET C_MUNICIPIO=CONCAT(PROVINCIA,MUNICIPIO)
  27.       WHERE C_PROVINCIA=PROVINCIA AND C_MUNICIPIO=MUNICIPIO;
  28.     END IF;
  29.   UNTIL DONE END REPEAT;
  30.   CLOSE C1;
  31.   /*Borra la tabla temporal*/
  32.   DROP TABLE IF EXISTS MUNICIPIOS_TEMP;
  33.  
  34. END $$
  35.  
  36. 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.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)