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

[SOLUCIONADO] Cursores Mysql

Estas en el tema de Cursores Mysql en el foro de Mysql en Foros del Web. Hola buen día, estoy utilizando cursores pero tengo un problema resulta que mi cursor debería obtener 2 datos pero esta mostrando 3 no se porque, ...
  #1 (permalink)  
Antiguo 16/04/2014, 11:36
 
Fecha de Ingreso: mayo-2010
Mensajes: 6
Antigüedad: 14 años, 7 meses
Puntos: 0
Cursores Mysql

Hola buen día, estoy utilizando cursores pero tengo un problema resulta que mi cursor debería obtener 2 datos pero esta mostrando 3 no se porque, les expongo las cosas con los códigos SQL que tengo:

Tabla asignacion_video (es una tabla referencial)

Código MySQL:
Ver original
  1. CREATE TABLE `asignacion_video` (
  2. `id_asignacionvideo` int(4) NOT NULL AUTO_INCREMENT,
  3. `id_ticket` int(4) NOT NULL,
  4. `id_oficialasignado` int(4) NOT NULL,
  5. PRIMARY KEY (`id_asignacionvideo`),
  6. KEY `id_oficialasignado` (`id_oficialasignado`),
  7. CONSTRAINT `asignacion_video_ibfk_1` FOREIGN KEY (`id_oficialasignado`) REFERENCES `usuario` (`id_usuario`) ON DELETE NO ACTION ON UPDATE NO ACTION

Actualmente no cuenta con un registro, cuando ejecuto mi SP debería de ser llenada, pero repite el ultimo registro.

SP Estructura:

Código MySQL:
Ver original
  1. DECLARE o,a INT;
  2. DECLARE ordernumbers CURSOR
  3. FOR
  4. asignacion_colonia.id_usuario
  5. asignacion_colonia
  6. INNER JOIN cat_estados AS cae ON asignacion_colonia.id_catestado = cae.id_estados
  7. cae.asentamiento LIKE parametro;
  8. DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
  9. SET a = ticket;
  10. OPEN ordernumbers;
  11. FETCH ordernumbers INTO o;
  12. CALL save_asignacionvideo(a,o);
  13. UNTIL done END REPEAT;
  14. CLOSE ordernumbers;

El resultado que se almacena en el cursor es el siguiente: 1 y 3

+------------+
| id_usuario |
+------------+
| 1 |
| 3 |
+------------+
2 rows in set

Entonces cuando ejecuto el procedimiento mando a llamar un insert en otro procedimiento que es el CALL save_asignacionvideo(a,o);
el cual debería de ingresar en la tabla lo siguiente

+--------------------+-----------+--------------------+
| id_asignacionvideo | id_ticket | id_oficialasignado |
+--------------------+-----------+--------------------+
| 1 | 1 | 1 |
| 2 | 1 | 3 |
+--------------------+-----------+--------------------+
Pero esta haciendo lo siguiente

+--------------------+-----------+--------------------+
| id_asignacionvideo | id_ticket | id_oficialasignado |
+--------------------+-----------+--------------------+
| 1 | 1 | 1 |
| 2 | 1 | 3 |
| 3 | 1 | 3 |
+--------------------+-----------+--------------------+
3 rows in set

lo cual no es lo correcto, espero y me puedan ayudar.

Saludos.
  #2 (permalink)  
Antiguo 17/04/2014, 08:24
 
Fecha de Ingreso: mayo-2010
Mensajes: 6
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Cursores Mysql

La solución fue simple, ingresar un IF antes de insertar :D

Código MySQL:
Ver original
  1.     DECLARE done BOOLEAN DEFAULT 0;
  2.     DECLARE o INT;
  3.     DECLARE ordernumbers CURSOR FOR SELECT asignacion_colonia.id_usuario FROM   asignacion_colonia INNER JOIN cat_estados AS cae ON asignacion_colonia.id_catestado = cae.id_estados WHERE cae.asentamiento = parametro;
  4.   DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
  5.     OPEN ordernumbers;
  6.       FETCH ordernumbers INTO o;
  7.             IF NOT done THEN
  8.                 CALL save_asignacionvideo(ticket,o);
  9.             END IF;
  10.     UNTIL done END REPEAT;
  11.     CLOSE ordernumbers;

Etiquetas: cursores, join, null, registro, select, sql, 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 20:27.