Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

error 1329 en Procedimiento

Estas en el tema de error 1329 en Procedimiento en el foro de Mysql en Foros del Web. Cita: CREATE DEFINER=`root`@`localhost` PROCEDURE `NOMBRE`() BEGIN DECLARE MAXI, idc INTEGER; DECLARE COR INTEGER DEFAULT 1; DECLARE estado VARCHAR(9); DECLARE FH, fr, fd DATE; DECLARE SEN ...
  #1 (permalink)  
Antiguo 15/08/2011, 16:50
Avatar de shinta_snake  
Fecha de Ingreso: diciembre-2009
Mensajes: 70
Antigüedad: 14 años, 3 meses
Puntos: 0
error 1329 en Procedimiento

Cita:
CREATE DEFINER=`root`@`localhost` PROCEDURE `NOMBRE`()
BEGIN

DECLARE MAXI, idc INTEGER;
DECLARE COR INTEGER DEFAULT 1;
DECLARE estado VARCHAR(9);
DECLARE FH, fr, fd DATE;
DECLARE SEN VARCHAR(20);
DECLARE PROG VARCHAR(40);
DECLARE STOCK VARCHAR(9);
DECLARE cr VARCHAR(10);
DECLARE cv VARCHAR(1);
DECLARE ne VARCHAR(40);
DECLARE up VARCHAR(13);
DECLARE ua VARCHAR(20);
DECLARE of VARCHAR(20);
DECLARE rb VARCHAR(40);
DECLARE A1, A2, A3 INTEGER DEFAULT 0;

SET MAXI = (SELECT MAX(idcatastros) FROM catastros);

WHILE (COR <= MAXI) DO

SELECT stock_idstock
INTO estado
FROM catastros
WHERE idcatastros = COR;

IF (estado = 'Terminado') THEN

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
INTO idc, fr, SEN, PROG, cr, cv, ne, up, ua, of, STOCK, rb, fd, FH, A1, A2, A3
FROM catastros
WHERE idcatastros=COR;

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)
VALUES (CURDATE(),idc, fr, SEN, PROG, cr, cv, ne, up, ua, of, STOCK, rb, fd, FH, A1, A2, A3);

DELETE FROM catastros WHERE idcatastros = COR;

END IF;

SET COR = COR + 1;

END WHILE;

END

El procedimiento se ejecuta y cumple su funcion pero me arroja este error

Cita:
0 row(s) affected, 9 warning(s):
1329 No data - zero rows fetched, selected, or processed
1329 No data - zero rows fetched, selected, or processed
  #2 (permalink)  
Antiguo 15/08/2011, 17:47
Avatar de 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: error 1329 en Procedimiento

No es exactamente un error. Implica que una operación con asignación a variable no obtuvo datos por lo que no puede ejecutar el resto del procedimiento.
El inconveniente es que no está bien programado por cuanto no estás considerando controlar la falta de datos u otras situaciones posibles.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 15/08/2011, 20:57
Avatar de shinta_snake  
Fecha de Ingreso: diciembre-2009
Mensajes: 70
Antigüedad: 14 años, 3 meses
Puntos: 0
Respuesta: error 1329 en Procedimiento

Cita:
Iniciado por gnzsoloyo Ver Mensaje
No es exactamente un error. Implica que una operación con asignación a variable no obtuvo datos por lo que no puede ejecutar el resto del procedimiento.
El inconveniente es que no está bien programado por cuanto no estás considerando controlar la falta de datos u otras situaciones posibles.
Exactamente, eso lo tengo claro. Pero cuando dices mal programado, cual parte te molesto del diseño del PA, para ver si la puedo mejorar y sacar el error.

espero tu respuesta.
  #4 (permalink)  
Antiguo 16/08/2011, 06:12
Avatar de 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: 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)

Etiquetas: procedimiento, select
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:16.