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

[SOLUCIONADO] cursor mysql, gran duda

Estas en el tema de cursor mysql, gran duda en el foro de Mysql en Foros del Web. Hola que tal gente, tengo un problemilla y recurro una vez mas a ustedes...el problema es el siguiente, a ver si me pueden a yudar ...
  #1 (permalink)  
Antiguo 01/04/2015, 10:48
 
Fecha de Ingreso: marzo-2015
Mensajes: 12
Antigüedad: 4 años, 6 meses
Puntos: 0
cursor mysql, gran duda

Hola que tal gente, tengo un problemilla y recurro una vez mas a ustedes...el problema es el siguiente, a ver si me pueden a yudar porfa, el primer cursor "micursor" trae el rut de la tabla alumno para el curso con id=13, este curso tiene solo dos alumnos, por lo tanto , esa consulta trae dos registros: ejemplo: 142345674, 165434566

luego en el insert lo que intento hacer es que, inserte dos registros en la tabla libcomunicaciones, si bien me hace el insert y la iteracion (2 veces), me inserta con el mismo rut que se extrae de "micursor", es decir hace dos insert pero con el rut 142345674, y lo que quiero hacer es un insert con el rut 142345674 y otro con el rut 165434566 ..

He tratado de exponer el problema lo mas claro posible..se que ando cerca de la solucion, pero no doy con ella, me debe faltar un LOOP o algo, pero he intentado y no logro solucionarlo ... de ante mano muchas gracias

Código SQL:
Ver original
  1. DROP PROCEDURE IF EXISTS `prueba`$$
  2.  
  3. CREATE DEFINER=`root`@`localhost` PROCEDURE `prueba`()
  4.  BEGIN
  5.  
  6.    DECLARE rut VARCHAR(10);
  7.    DECLARE contador INT(10);
  8.    DECLARE inicio INT (10) DEFAULT 0;
  9.    DECLARE micursor CURSOR FOR SELECT rut_alum FROM alumno WHERE id_curso=13;
  10.    DECLARE micursor2 CURSOR FOR SELECT COUNT(rut_alum) FROM alumno WHERE id_curso=13;
  11.      
  12.    OPEN micursor;
  13.    OPEN micursor2;
  14.      
  15.     FETCH micursor INTO rut;
  16.     FETCH micursor2 INTO contador;
  17.    
  18.           WHILE inicio < contador DO   
  19.    
  20.            INSERT INTO libcomunicacion(id_com,id_curso,des_com,fech_com,fecha_dada,tipo_com,rut_alum)
  21.                 VALUES('','13','comunicacion desde el procedimiento','2015-06-12',NOW(),'r',rut);  
  22.            SET inicio = inicio+1;      
  23.           END WHILE;
  24.    
  25.    CLOSE micursor2;    
  26.    CLOSE micursor;
  27.    
  28.  END$$
  #2 (permalink)  
Antiguo 01/04/2015, 11:17
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.318
Antigüedad: 11 años, 9 meses
Puntos: 2653
Respuesta: cursor mysql, gran duda

En las FAQs de MySQL hay una descripción de lo que se necesita para usar cursores: ¿Cómo recorrer iterativamente el resultado de una consulta dentro de un procedimiento almacenado?
A mi entender, mirandolo por encima, estás trabajando en forma incompleta, y demasiado complicada al mismo tiempo.

Cuando lelgue a casa lo analizo mejor.

Muevo a Foro de MySQL.
__________________
¿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 01/04/2015, 11:30
 
Fecha de Ingreso: marzo-2015
Mensajes: 12
Antigüedad: 4 años, 6 meses
Puntos: 0
Respuesta: cursor mysql, gran duda

Cita:
Iniciado por gnzsoloyo Ver Mensaje
En las FAQs de MySQL hay una descripción de lo que se necesita para usar cursores: [URL="http://www.forosdelweb.com/f86/faqs-mysql-489891/#post4209262"] ¿Cómo recorrer iterativamente el resultado de una consulta dentro de un procedimiento almacenado?[/URL]
A mi entender, mirandolo por encima, estás trabajando en forma incompleta, y demasiado complicada al mismo tiempo.

Cuando lelgue a casa lo analizo mejor.

Muevo a Foro de MySQL.
gracias por responder, mirare el link que me dejas, y a ver si puedes analizar el codigo cuando llegues a casa :)
  #4 (permalink)  
Antiguo 01/04/2015, 13:29
 
Fecha de Ingreso: marzo-2015
Mensajes: 12
Antigüedad: 4 años, 6 meses
Puntos: 0
Respuesta: cursor mysql, gran duda

mmm no se como decirle al cursor que avance al segundo registro, ya que este contiene 2 registros... valga de redundancia ... hace dos insert que es lo que quiero... pero con un registro...y lo que quiero es un insert por cada registro...que este caso es el rut... como explico en la primera pregunta
  #5 (permalink)  
Antiguo 01/04/2015, 15:07
 
Fecha de Ingreso: marzo-2015
Mensajes: 12
Antigüedad: 4 años, 6 meses
Puntos: 0
Respuesta: cursor mysql, gran duda

con este codigo he logrado que haga un insert por cada registro que en este caso son dos...sin embargo me inserta 3 registros...es decir el ultimo lo repite... no se como cortarlo antes..ejempplo

insert rut: 123456656 eso esta bien

insert rut: 153324456 eso tambien esta bien... pero luego vuelve hacer otro insert con este mismo rut

Código sql:
Ver original
  1. DROP PROCEDURE IF EXISTS `prueba2`$$
  2.  
  3. CREATE DEFINER=`root`@`localhost` PROCEDURE `prueba2`()
  4.  BEGIN
  5.  
  6.    DECLARE rut VARCHAR(10);
  7.    DECLARE done BOOLEAN DEFAULT 0;
  8.      
  9.    
  10.    DECLARE micursor CURSOR FOR SELECT rut_alum FROM alumno WHERE id_curso=13;
  11.    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
  12.    
  13.      
  14.    OPEN micursor;
  15.  
  16.     REPEAT
  17.        FETCH micursor INTO rut;
  18.          INSERT INTO libcomunicacion(id_com,id_curso,des_com,fech_com,fecha_dada,tipo_com,rut_alum)
  19.          VALUES('','13','comunicacion desde el procedimiento','2015-06-12',NOW(),'r',rut);                             
  20.     UNTIL done END REPEAT;
  21.    
  22.    CLOSE micursor;
  23.    
  24.  END$$
  #6 (permalink)  
Antiguo 02/04/2015, 06:19
 
Fecha de Ingreso: marzo-2015
Mensajes: 12
Antigüedad: 4 años, 6 meses
Puntos: 0
Respuesta: cursor mysql, gran duda

alguien? que me ayude en ese ultimo detalle porfavor?
  #7 (permalink)  
Antiguo 02/04/2015, 07:48
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.318
Antigüedad: 11 años, 9 meses
Puntos: 2653
Respuesta: cursor mysql, gran duda

Pruebalo asi:
Código MySQL:
Ver original
  1. DROP PROCEDURE IF EXISTS `prueba2`$$
  2.  
  3. CREATE PROCEDURE `prueba2`()
  4.  
  5.    DECLARE rut VARCHAR(10);
  6.      
  7.    
  8.    DECLARE micursor CURSOR FOR SELECT rut_alum FROM alumno WHERE id_curso=13;
  9.    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=TRUE;
  10.    
  11.      
  12.    OPEN micursor;
  13.  
  14.     REPEAT
  15.        FETCH micursor INTO rut;
  16.     IF NOT done THEN
  17.          INSERT INTO libcomunicacion(id_curso,des_com,fech_com,fecha_dada,tipo_com,rut_alum)
  18.          VALUES(13,'comunicacion desde el procedimiento','2015-06-12',NOW(),'r',rut);                              
  19.     END IF;
  20.     UNTIL done END REPEAT;
  21.    
  22.    CLOSE micursor;
  23.    
  24.  END$$
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 02/04/2015, 09:19
 
Fecha de Ingreso: marzo-2015
Mensajes: 12
Antigüedad: 4 años, 6 meses
Puntos: 0
Respuesta: cursor mysql, gran duda

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Pruebalo asi:
Código MySQL:
Ver original
  1. DROP PROCEDURE IF EXISTS `prueba2`$$
  2.  
  3. CREATE PROCEDURE `prueba2`()
  4.  
  5.    DECLARE rut VARCHAR(10);
  6.      
  7.    
  8.    DECLARE micursor CURSOR FOR SELECT rut_alum FROM alumno WHERE id_curso=13;
  9.    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=TRUE;
  10.    
  11.      
  12.    OPEN micursor;
  13.  
  14.     REPEAT
  15.        FETCH micursor INTO rut;
  16.     IF NOT done THEN
  17.          INSERT INTO libcomunicacion(id_curso,des_com,fech_com,fecha_dada,tipo_com,rut_alum)
  18.          VALUES(13,'comunicacion desde el procedimiento','2015-06-12',NOW(),'r',rut);                              
  19.     END IF;
  20.     UNTIL done END REPEAT;
  21.    
  22.    CLOSE micursor;
  23.    
  24.  END$$
Uff exactamente lo que buscaba, muchas gracias estimado... funciona tal cual como queria... ... cerrare el tema...como resuelto..gracias una vez mas

Etiquetas: bases-de-datos-general, cursor, ejemplo, registros, 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 17:54.