Ver Mensaje Individual
  #4 (permalink)  
Antiguo 16/08/2011, 06:12
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: error 1329 en Procedimiento

Bueno, el primer problema es que lo que tu estás tratando de hacer es recorrer los registros uno a uno de una tabla, leyéndolos por medio de su ID, pero no estás considerando la posibilidad de que un ID (dos en este caso) no existan o hayan sido borrados. En ese caso se generará un error porque las variables devuelven NULL y por tanto debería controlarse eso.
Por otro lado, si lo que quieres es recorrer toda la tabla, estás haciéndolo del modo incorrecto: Para eso se usan cursores.
Finalmente, lo que quieres es tomar todos los registros que cumplen una condición ("Terminado") y guardarlos en otra tabla... Bueno, para eso sólo necesitarías una consulta, y no tanto proceso.
Con cursores sería mas o menos así:
Código MySQL:
Ver original
  1. DELIMITER $$
  2.  
  3. CREATE DEFINER=`root`@`localhost` PROCEDURE `NOMBRE`()
  4.  
  5.     DECLARE MAXI, idc INTEGER;
  6.     DECLARE FIN INTEGER DEFAULT 0;
  7.     DECLARE estado VARCHAR(9);
  8.     DECLARE FH, fr, fd DATE;
  9.     DECLARE SEN VARCHAR(20);
  10.     DECLARE PROG VARCHAR(40);
  11.     DECLARE STOCK VARCHAR(9);
  12.     DECLARE cr VARCHAR(10);
  13.     DECLARE cv VARCHAR(1);
  14.     DECLARE ne VARCHAR(40);
  15.     DECLARE up VARCHAR(13);
  16.     DECLARE ua VARCHAR(20);
  17.     DECLARE of VARCHAR(20);
  18.     DECLARE rb VARCHAR(40);
  19.     DECLARE A1, A2, A3 INTEGER DEFAULT 0;
  20.     DECLARE cur1 CURSOR FOR
  21.     SELECT idcatastros, c_fecregistro, senal_idsenal, programa_idprograma, clientes_rutclientes, clientes_cvclientes, nombre_empresa, usuarios_c_perfil, usuarios_auspicio, oficina_idoficina, stock_idstock, rubro_idrubro, fecha_desde, fecha_hasta, avisos_idavi1, avisos_idavi2, avisos_idavi3
  22.     FROM catastros
  23.     WHERE estado = 'Terminado';
  24.     DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET FIN = 1;
  25.    
  26.     OPEN cur1;
  27.     CICLO:REPEAT
  28.         IF FIN THEN
  29.             LEAVE CICLO;
  30.         END IF;
  31.             FETCH cur1
  32.             INTO idc, fr, SEN, PROG, cr, cv, ne, up, ua, of, STOCK, rb, fd, FH, A1, A2, A3;
  33.  
  34.             INSERT INTO historial (fecha_termino, idcatastros, c_fecregistro, senal_idsenal, programa_idprograma, clientes_rutclientes, clientes_cvclientes, nombre_empresa, usuarios_c_perfil, usuarios_auspicio, oficina_idoficina, stock_idstock, rubro_idrubro, fecha_desde, fecha_hasta, avisos_idavi1, avisos_idavi2, avisos_idavi3)
  35.             VALUES (CURDATE(),idc, fr, SEN, PROG, cr, cv, ne, up, ua, of, STOCK, rb, fd, FH, A1, A2, A3);
  36.     UNTIL FIN END REPEAT CICLO;
  37.     CLOSE cur1;
  38.     DELETE FROM catastros
  39.     WHERE estado = 'Terminado';
  40. END$$
  41. DELIMITER ;

Y sin cursores se reduce a:
Código MySQL:
Ver original
  1. DELIMITER $$
  2.  
  3. CREATE DEFINER=`root`@`localhost` PROCEDURE `NOMBRE`()
  4.     INSERT INTO historial (fecha_termino, idcatastros, c_fecregistro, senal_idsenal, programa_idprograma, clientes_rutclientes, clientes_cvclientes, nombre_empresa, usuarios_c_perfil, usuarios_auspicio, oficina_idoficina, stock_idstock, rubro_idrubro, fecha_desde, fecha_hasta, avisos_idavi1, avisos_idavi2, avisos_idavi3)
  5.     SELECT idcatastros, c_fecregistro, senal_idsenal, programa_idprograma, clientes_rutclientes, clientes_cvclientes, nombre_empresa, usuarios_c_perfil, usuarios_auspicio, oficina_idoficina, stock_idstock, rubro_idrubro, fecha_desde, fecha_hasta, avisos_idavi1, avisos_idavi2, avisos_idavi3
  6.     FROM catastros
  7.     WHERE estado = 'Terminado';
  8.     DELETE FROM catastros
  9.     WHERE estado = 'Terminado';
  10. END$$
  11. 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)