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

Error de Cursor con While.

Estas en el tema de Error de Cursor con While. en el foro de Mysql en Foros del Web. Hola amigos: Tengo este Store donde se debe insertar en la tabla de Fee una linea que tiene Año,Mes, Codigo,Estado Este es por cada cliente ...
  #1 (permalink)  
Antiguo 08/04/2013, 22:43
 
Fecha de Ingreso: febrero-2004
Ubicación: Lima
Mensajes: 3
Antigüedad: 20 años, 1 mes
Puntos: 0
Pregunta Error de Cursor con While.

Hola amigos: Tengo este Store donde se debe insertar en la tabla de Fee una linea que tiene Año,Mes, Codigo,Estado
Este es por cada cliente
Entonces, pongo el rango de años para crear por año los meses y los valores pero no funciona.

No funciona el cursor y sale un error de:
Error Code : 1329
No data - zero rows fetched, selected, or processed

Hay 1367 clientes y tengo q hacer los años por cada clientes.

A ver si me dan una guia.

Gracias.

Código MySQL:
Ver original
  1. DELIMITER //
  2. CREATE PROCEDURE sp_CreateFeeCustomer (IN ano_ini INT,IN ano_fin INT)
  3. DECLARE Ano1 INT;
  4. DECLARE CNo VARCHAR(12);
  5. DECLARE cur1 CURSOR FOR SELECT CustomerNo FROM Customer;
  6. DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
  7. SET Ano1 = ano_ini;
  8.  
  9. OPEN cur1;
  10. curl:REPEAT
  11. FETCH cur1 INTO CNo;
  12. IF NOT done THEN
  13.     SET fc = 0;
  14.     WHILE Ano1 < ano_fin+1 DO
  15.         SET t = 1;
  16.         WHILE t < 13 DO
  17.             INSERT INTO Fee VALUES (Ano1,CNo,IF(LENGTH(t)=1,CONCAT('0',t),t),fc,0);
  18.         SET t = t + 1;
  19.         END WHILE;
  20.     SET fc = fc + 1;
  21.     SET Ano1 = Ano1 + 1;
  22.     END WHILE;
  23. UNTIL done
  24. END REPEAT curl;
  25. CLOSE cur1;
  26. //
  27.  
  28. CALL sp_CreateFeeCustomer(2012,2014);

Última edición por gnzsoloyo; 09/04/2013 a las 05:31 Razón: Mal etiquetado.
  #2 (permalink)  
Antiguo 09/04/2013, 05:16
 
Fecha de Ingreso: abril-2013
Mensajes: 1
Antigüedad: 11 años
Puntos: 0
Respuesta: Error de Cursor con While.

Hola, yo tengo el mismo problema con un store en MySql , el problema por lo que pude ver es que cuando la "actualizacion" dentro del WHILE falla , sale del bucle , pero no se como se soluciona.
  #3 (permalink)  
Antiguo 09/04/2013, 05:45
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 de Cursor con While.

@xplector: Prueba con un handler sobre SQLSTATE '02000', y no sobre not found.
Código MySQL:
Ver original
  1. DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' done = 1;
PD: Para mí, es posible hacer ese SP sin usar cursores.

@galessan: Bienvenido al foro. Para mejor participación te recomiendo no "colgar" preguntas propias de posts ajenos. Abre un post propio y en todo caso agrega el link (o la dirección) al otro post del otro forista, o bie (mejor aún), explica tu problema, porque el que sean parecidos no implica que tengan la misma solución ni se causen por el mismo problema.
En todos los foros (no sólo en FDW), colgarse de posts ajenos se considera una descortesía.
En cuanto a tu problema, sin ver el código de tu SP, no podemos saber el origen del error, pero por lo que describes, no estás usando condition handlers, o si lo haces no lo estás haciendo bien.
Abre un tema propio, y postea tu problema.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 09/04/2013, 11:41
 
Fecha de Ingreso: junio-2011
Mensajes: 139
Antigüedad: 12 años, 10 meses
Puntos: 42
Respuesta: Error de Cursor con While.

Hola xplertor,

Veo un problema en el SP que genera que parte de la lógica del mismo aplique solo al primer cliente, es en la línea:
Código MySQL:
Ver original
  1. WHILE Ano1 < ano_fin+1 DO
La variable se incrementa correctamente al primer cliente:
Código MySQL:
Ver original
  1. SET Ano1 = Ano1 + 1;
sin embargo, al pasar al segundo cliente, la variable "Ano1" no se asigna de nuevo al valor de "ano_ini", por lo que la condición (WHILE Ano1 < ano_fin+1 DO) no se cumple para el resto de clientes.

Una opción para solventar es:
Código MySQL:
Ver original
  1. ...
  2. DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
  3. /* SET Ano1 = ano_ini; */
  4.  
  5. OPEN cur1;
  6. curl:REPEAT
  7.    FETCH cur1 INTO CNo;
  8.    IF NOT done THEN
  9.       SET fc = 0;
  10.       SET Ano1 = ano_ini; /* Asignación para cada iteración del cursor */
  11.       WHILE Ano1 < ano_fin+1 DO
  12. ...
El problema:
Código MySQL:
Ver original
  1. Error Code: 1329
  2. No data - zero rows fetched, selected, or processed
puede ser originado al trata de leer el cursor y el mismo no tiene datos disponibles, en este caso el HANDLER debe manejar esa excepción.

Comparto la idea con gnzsoloyo de la posibilidad de solventer sin el uso del cursor.

Espero sea útil la información.
  #5 (permalink)  
Antiguo 21/04/2013, 22:57
 
Fecha de Ingreso: febrero-2004
Ubicación: Lima
Mensajes: 3
Antigüedad: 20 años, 1 mes
Puntos: 0
Respuesta: Error de Cursor con While.

Muchas gracias por las ideas propuestas. Aunque actualmente no tengo la posibilidad de realizar las pruebas del caso por vacaciones (en 2 dias terminan) realizare las propuestas hechas.
A modo de aprendizaje (ya que es la primera vez en uso de MySQL o SQL), quisiera el modo que podrian realizarse sin cursor dado que la cantidad de registros a utilizar es grande (150 mil minimo).
Nuevamente agradezco el apoyo brindado, e ire comentando lo obtenido como resultado.

Etiquetas: cursor, insert, select, tabla
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 12:13.