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

[SOLUCIONADO] Loop en Cursor de Procedimiento Almacenado

Estas en el tema de Loop en Cursor de Procedimiento Almacenado en el foro de Mysql en Foros del Web. Estoy haciendo un PA para una consulta. El resultado de la consulta, lo quiero incluir en una tabla temporal. Para ello hago un LOOP para ...
  #1 (permalink)  
Antiguo 21/05/2014, 11:24
 
Fecha de Ingreso: junio-2013
Mensajes: 13
Antigüedad: 11 años, 6 meses
Puntos: 0
Loop en Cursor de Procedimiento Almacenado

Estoy haciendo un PA para una consulta.

El resultado de la consulta, lo quiero incluir en una tabla temporal.

Para ello hago un LOOP para que se inserten los datos en la tabla.

Todo esta ok, EXCEPTO que el último registro lo inserta por DUPLICADO.

Entiendo que es un problema del LOOP, pero llevo unas horas y no encuentro la explicación.

Agradecería un "poco de luz"

PD: Este es el codigo

Código MySQL:
Ver original
  1. DECLARE CONTINUE HANDLER FOR NOT FOUND SET l_last_row_fetched=1;
  2. SET l_last_row_fetched=0;
  3.  
  4. OPEN cur1; 
  5.  
  6. cursor_loop:LOOP
  7.  
  8.     FETCH  cur1 INTO  v_id,v_prioridad_Id, v_status_id, v_status, v_contrato_id, v_objetivo, v_origen, v_descripcion, v_creador,v_retraso, v_fecha_creacion, v_fecha_inicio, v_fecha_fin, v_fecha_modif, v_fecha_cierre, v_modificador, v_ult_modif,v_cerrador, v_codigo, v_poblacion;
  9.     INSERT INTO 080_acciones_temp (id,prioridad_Id, status_id, status, contrato_id, objetivo, origen, descripcion, creador,retraso, fecha_creacion, fecha_inicio, fecha_fin, fecha_modif, fecha_cierre, modificador, ult_modif,cerrador, codigo, poblacion) values (v_id,v_prioridad_Id, v_status_id, v_status, v_contrato_id, v_objetivo, v_origen, v_descripcion, v_creador,v_retraso, v_fecha_creacion, v_fecha_inicio, v_fecha_fin, v_fecha_modif, v_fecha_cierre, v_modificador, v_ult_modif,v_cerrador, v_codigo, v_poblacion);
  10.  
  11.     IF l_last_row_fetched=1 THEN  
  12.     LEAVE cursor_loop;
  13.  
  14.      END IF;
  15. END LOOP cursor_loop;
  16.    
  17. CLOSE cur1;
  18.     SET l_last_row_fetched=0;
  19.    
  20.     Select * from 080_acciones_temp;
  #2 (permalink)  
Antiguo 21/05/2014, 11:28
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Loop en Cursor de Procedimiento Almacenado

Hay muchas formas de resolverlo, pero la más simple sería:
Código MySQL:
Ver original
  1. DECLARE CONTINUE HANDLER FOR NOT FOUND SET l_last_row_fetched=1;
  2. SET l_last_row_fetched=0;
  3.  
  4. OPEN cur1; 
  5.  
  6. cursor_loop:LOOP
  7.     IF l_last_row_fetched=1 THEN  
  8.         LEAVE cursor_loop;
  9.     END IF;
  10.     FETCH  cur1 INTO  v_id,v_prioridad_Id, v_status_id, v_status, v_contrato_id, v_objetivo, v_origen, v_descripcion, v_creador,v_retraso, v_fecha_creacion, v_fecha_inicio, v_fecha_fin, v_fecha_modif, v_fecha_cierre, v_modificador, v_ult_modif,v_cerrador, v_codigo, v_poblacion;
  11.     INSERT INTO 080_acciones_temp (id,prioridad_Id, status_id, status, contrato_id, objetivo, origen, descripcion, creador,retraso, fecha_creacion, fecha_inicio, fecha_fin, fecha_modif, fecha_cierre, modificador, ult_modif,cerrador, codigo, poblacion) values (v_id,v_prioridad_Id, v_status_id, v_status, v_contrato_id, v_objetivo, v_origen, v_descripcion, v_creador,v_retraso, v_fecha_creacion, v_fecha_inicio, v_fecha_fin, v_fecha_modif, v_fecha_cierre, v_modificador, v_ult_modif,v_cerrador, v_codigo, v_poblacion);
  12.  
  13. END LOOP cursor_loop;
__________________
¿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 22/05/2014, 02:08
 
Fecha de Ingreso: junio-2013
Mensajes: 13
Antigüedad: 11 años, 6 meses
Puntos: 0
Respuesta: Loop en Cursor de Procedimiento Almacenado

Gracias gnzsoloyo:

He probado tu respuesta y, por el motivo que sea, no me ha funcionado. De todos modos, adjunto la solución que he encontrado, por si es de utilidad para otras personas.

saludos cordiales.

PD: el codigo es el siguiente:

#defino el handler
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

#abro el cursor
OPEN cur1;

#comienza loop
the_loop: LOOP
FETCH cur1 INTO v_id,v_prioridad_Id, v_status_id, v_status, v_contrato_id, v_objetivo, v_origen, v_descripcion, v_creador,v_retraso, v_fecha_creacion, v_fecha_inicio, v_fecha_fin, v_fecha_modif, v_fecha_cierre, v_modificador, v_ult_modif,v_cerrador, v_codigo, v_poblacion;

IF done THEN LEAVE the_loop;
END IF;

INSERT INTO 080_acciones_temp (id,prioridad_Id, status_id, status, contrato_id, objetivo, origen, descripcion, creador,retraso, fecha_creacion, fecha_inicio, fecha_fin, fecha_modif, fecha_cierre, modificador, ult_modif,cerrador, codigo, poblacion) values (v_id,v_prioridad_Id, v_status_id, v_status, v_contrato_id, v_objetivo, v_origen, v_descripcion, v_creador,v_retraso, v_fecha_creacion, v_fecha_inicio, v_fecha_fin, v_fecha_modif, v_fecha_cierre, v_modificador, v_ult_modif,v_cerrador, v_codigo, v_poblacion);

END LOOP the_loop;

#cierro el cursor
CLOSE cur1;

Select * from 080_acciones_temp;

Última edición por maregeo; 22/05/2014 a las 02:30

Etiquetas: almacenado, cursor, loop, procedimiento, registro, 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 14:03.