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

Procedimiento Almacenado MySQL con cursor

Estas en el tema de Procedimiento Almacenado MySQL con cursor en el foro de Mysql en Foros del Web. Hola, espero que me puedan ayudar, debo hacer un procedimiento almacenado en MySQL pero no sé cómo hacerlo.... tengo las tablas: *VENTAS (id, id_producto, id_cliente, ...
  #1 (permalink)  
Antiguo 03/06/2011, 16:44
 
Fecha de Ingreso: marzo-2011
Mensajes: 6
Antigüedad: 13 años
Puntos: 0
Procedimiento Almacenado MySQL con cursor

Hola, espero que me puedan ayudar, debo hacer un procedimiento almacenado en MySQL pero no sé cómo hacerlo.... tengo las tablas:

*VENTAS (id, id_producto, id_cliente, fecha_venta)
*PRODUCTO (id, id_producto, precio)
*CLIENTE (id_cliente, total_compra)

-Debo crear un cursor que recorra la tabla CLIENTE.
-Calcular para el cliente en curso, el total de compras realizado (consulta a las tablas VENTAS, PRODUCTO Y CLIENTE).
-Realizar la actualización del campo total_compra del cliente en curso.
-Reptir todos los pasos hasta procesar todos los registros de la tabla CLIENTE.

Las tablas ya tienen datos, el único dato que falta es el del total_compra de la tabla CLIENTE.

Si me pueden ayudar se los agradezco.... saludos!!!
  #2 (permalink)  
Antiguo 04/06/2011, 06: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: Procedimiento Almacenado MySQL con cursor

Si has empezado algo, postea lo que tienes. Orientarte desde un código ya bocetado muchas veces ayuda a indicar los errores principales.
Tips básicos:
1) Necesitas un HANDLER para el SQLSTATE '02000' para que MySQL determine el cierre de la lectura cuando llegue al último registro. Si no lo usas se generará un error cuando el cursor intente avanzar más allá de eso.
2) Necesitarás una variable que uses de flag para indicar que salga de la lectura. Se usa en combinación con el HANDLER, haciendo que este cambie el estado del flag.
3) Todas las variables locales se declaran todas al principio. No se puede declarar variables luego de declarar el HANDLER, ni siquiera cursores.
4) No puedes actualizar la(s) tabla(s) que lee el cursor, porque al momento de recorrerla(s) tiene(n) un bloqueo de lectura/escritura, producto del trazado del cursor. Obviamente el proceso tiene que ser planeado de modo que eso no impida el UPDATE que quieres hacer.
__________________
¿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 05/06/2011, 20:07
 
Fecha de Ingreso: marzo-2011
Mensajes: 6
Antigüedad: 13 años
Puntos: 0
Respuesta: Procedimiento Almacenado MySQL con cursor

Hola, gracias por responder, esto es lo que llevo hasta ahora pero tengo dudas de que sea así .... me podrías explicar cómo funciona lo del FETCH?? Gracias

CREATE PROCEDURE actualizar_total_compra()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE acum_compra INT;
DECLARE cursor1 CURSOR FOR SELECT total_compra FROM cliente;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
OPEN cursor1;

FETCH NEXT FROM cursor1 INTO acum_compra;
WHILE @@FETCH_STATUS = 0
BEGIN
acum_compra = SELECT SUM(producto.precio), FROM producto, ventas, cliente WHERE ventas.id_producto = producto.id AND ventas.id_cliente = cliente.id_cliente GROUP BY producto.precio;
INSERT INTO cliente.total_compra VALUES (acum_compra);
FETCH NEXT FROM cursor1 INTO acum_compra;
END

CLOSE cursor1;
DEALLOCATE cursor1
END

Etiquetas: cursor, procedimientos, almacenar
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 09:23.