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

Una Sobre Cursores

Estas en el tema de Una Sobre Cursores en el foro de SQL Server en Foros del Web. Estimados: me pongo en contacto con uds para realizarles la siguiente pregunta. Antes una ACLARACION: me canse de buscar en el google una posible respuesta, ...
  #1 (permalink)  
Antiguo 20/03/2008, 15:40
 
Fecha de Ingreso: marzo-2008
Mensajes: 3
Antigüedad: 16 años, 2 meses
Puntos: 0
Exclamación Una Sobre Cursores

Estimados: me pongo en contacto con uds para realizarles la siguiente pregunta.
Antes una

ACLARACION: me canse de buscar en el google una posible respuesta, incluso en este mismo foro y no he encontrado nada.

He leido muchos comentarios/articulos/opiniones que plantean que la utilizacion de cursores es NEGATIVA en cuanto a la performance del motor de base de datos. Sin embargo, en ninguno de estos articulos he encontrado la forma de reemplazar el uso del cursor (salvo uno que utiliza tabla temporales y recorre con un WHILE uno a uno los registros, lo que me parece igual de perjudicial para el motor). Vamos a un ejemplo:

Supongamos un sistema para control de stock en una discoteca, la estructura BASICA de tablas seria algo asi:

TRAGOS
id_trago
descripcion
precio

BEBIDAS
id_bebida
descripcion
cant_stock

COMPOSICIONES
id_proporcion
id_trago
id_bebida
proporcion

Entonces, supongamos el TRAGO WHISKY CON COCA COLA. Dicho trago esta ccompuesto por WHISKY y por COCA COLA. Esa composicion esta guardada en la tabla COMPOSICIONES donde se registra que cantidad lleva de cada uno.
Supongamos entonces que podemos definir al trago WHISKY CON COCA COLA de la siguiente manera:

WHISKY CON COCA COLA
WHISKY --- 0.07
COCA COLA --- 0.20


Esto quiere decir que, cuando se VENDA un WHISKY CON COCA COLA se deben DESCONTAR del stock de BEBIDAS 0.07 de WHISKY y 0.20 de COCA COLA.

Si por ejemplo, tuvieramos en la barra una botella de WHISKY y una botella de COCA COLA, luego de vender un WHISKY CON COCA COLA, WHISKY quedaria en 0.93 (resta 0.07) y COCA COLA quedaria en 0.80 (resta 0.20).

Vamos bien?

Ahora, esta operacion seria muy simple de llevar a cabo utilizando un cursor en un
procedimiento almacenado. Simplemente me imagino, seleccionar todas las composiciones de WHISKY CON COCA COLA y recorrerlas una a una para ir DECREMENTANDO el STOCK en la tabla BEBIDAS de acuerdo a la proporcion establecida para cada bebida base.

Ahora... la gran pregunta: COMO PUEDO HACER ESTO SIN LA UTILIZACION DE CURSORES ???? HAY ALGUNA FORMA O ESTE ES EL CASO QUE PLANTEAN EN MUCHOS LADOS EN LA RED DONDE NO SE PUEDE NO UTILIZAR CURSORES ???

Tal vez les resulte una pavada pero esta pregunta me la vengo haciendo hace unos dias y todavia no encuentro una consulta SQL que me permita hacer esa actualizacion. Les agradeceria MUCHISIMO si alguien me puede tirar una idea de como se podria hacer para no caer en la utilizacion de cursores. Espero sus respuestas!!!! Muchas gracias !!!
  #2 (permalink)  
Antiguo 21/03/2008, 07:32
Avatar de Beakdan  
Fecha de Ingreso: diciembre-2001
Ubicación: Monterrey, Nuevo León
Mensajes: 433
Antigüedad: 22 años, 4 meses
Puntos: 7
Re: Una Sobre Cursores

Hay problemas difíciles de expresar con operadores relacionales, que podría ser candidatos para utilizar un cursor, pero este no es el caso.
Creo que falta que indiques una tabla más. Supongo que tienes una tabla en la cual guardas una relación de tragos vendidos. Usando JOINS y funciones de agregado, podemos obtener en un solo paso el total usado para cada bebida. Luego, se usa ese resultado para decrementar el stock en un solo update. Usando el cursor ocurrirían mútiples updates lo cual lo haría una opción ineficiente.
Lo que me confunde es esto:
Cita:
cuando se VENDA un WHISKY CON COCA COLA se deben DESCONTAR del stock de BEBIDAS
Si lo necesitas actualizar cuando se vende el trago, ¿para que necesitas un cursor? Sigue siendo un sencillo update.

Algo como:
Código:
UPDATE        BEBIDAS
SET        cant_stock = cant_stock - c.proporcion
FROM        BEBIDAS AS upd
INNER JOIN    COMPOSICIONES AS c
        ON upd.id_bebida = c.id_bebida
WHERE        c.id_trago = ?
Donde simplemente debes pasar el id_trago de "WHISKY CON COCA COLA" y listo.
  #3 (permalink)  
Antiguo 22/03/2008, 14:31
 
Fecha de Ingreso: marzo-2008
Mensajes: 3
Antigüedad: 16 años, 2 meses
Puntos: 0
De acuerdo Re: Una Sobre Cursores

Hola Beakdan! Tal como los has escrito, funciono A LA PERFECCION!!!!!
Y es que JAMAS habia utilizado INNER JOIN hasta ahora, pero por suerte solo una sola vez cursores (un caso muy parecido a este). La verdad, me has salvado. Me tiraste JUSTO JUSTO la respuesta a mi pregunta. Te agradezco muchisimo por la prontitud de la respuesta. Será cuestion de revisar los SPs que hice hasta ahora para mejorarlos ;)
Un abrazo amigo, muchas gracias de nuevo.

Bernabé.
  #4 (permalink)  
Antiguo 22/03/2008, 22:00
 
Fecha de Ingreso: marzo-2008
Mensajes: 11
Antigüedad: 16 años, 1 mes
Puntos: 0
Re: Una Sobre Cursores

En realidad creo que el uso de los cursores debe restringuirse a casos excepcionales pues (hasta donde sé) la memoria se puede saturar y si los querys son bastante recargados compromete la performance del programa.
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 13:00.