SQL - Recorrer un cursor

 
Vista:

Recorrer un cursor

Publicado por Consuelo (20 intervenciones) el 05/05/2006 19:14:47
Qué tal he creado un procedimiento pero no se que hacer para que recorra cada una de los registros, que tiene, por ejemplo, hice esta tabla para ver si mi procedimiento esta bien.

Tabla Prueba_Proc
-----------------------------------
Clave | Valor
1 |
2 |
3 |
4 |
5 |

Después hice mi procedimiento para que solo actualizara la columna valor con un numero consecutivo.

CREATE PROCEDURE dbo.ProcPrueba AS
DECLARE @cont INTEGER, @a_clave INTEGER
SET @cont=0;

DECLARE a CURSOR FOR (SELECT clave FROM Med.dbo.Prueba_Proc) OPEN a FETCH NEXT FROM a INTO @a_clave
WHILE @@FETCH_STATUS=0
BEGIN
SET @cont=@cont+1
UPDATE Med.dbo.prueba SET valor=@cont WHERE clave=@a_clave;
END CLOSE a
DEALLOCATE a

EXECUTE master.dbo.prueba

Como pueden ver solo tomo todos los valores que haya dentro de la columna clave de mi tabla Prueba_Proc y después la idea erá el recorrer registro a registro y actualizar su correspondiente columna de "Valor", pero cuando ejecuto el procedimiento se queda horas trabajando y cuando lo detengo y veo la tabla que hice me muestra esto:

Tabla Prueba_Proc
-----------------------------------
Clave | Valor
1 | 2690
2 | NULL
3 | NULL
4 | NULL
5 | NULL

Eso quiere decir entónces que el cursor solo se quedo en el primer registro jamás pasa al siguiente. Pero si le quito el while que hay entónces el procemiento no hace nada y me deja todos los valores en NULL.
Por favor me pueden decir como hacer para que esta función pueda recorrer registro a registro cada valor de la tabla.
Con eso ya puede corregir el procemiento que hice para la generación de una tabla dedicada a CUBOS el cual es bastante extenso. Por favor es todo lo que me falta.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Recorrer un cursor

Publicado por Consuelo (20 intervenciones) el 05/05/2006 19:19:02
Se me olvidaba decir que lo estoy haciendo en SQL-SERVER 2000
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Recorrer un cursor

Publicado por Isaías (5072 intervenciones) el 05/05/2006 19:57:42
Perdona que insista, OLVIDA LOS CURSORES, mandame la DESCRIPCION de tus tablas y te mando el SCRIPT que debes ejecutar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Recorrer un cursor

Publicado por Consuelo (20 intervenciones) el 09/05/2006 00:53:43
Mi primera tabla que manejo es sobre los representantes a cargos de varios vendedores.

Rep

clave_rep | nombre

1 Alfonso gonzalez
2 Alberto martinez
3 Armando romero
4 Benito palomo
5 Bruno serrano

La segunda tabla que manejo son los vendedores, disculpa que ponga solo los nombres pero transcribirlos es algo pesado.

Vendedores

Clave_ven | nombre | clave_rep | clave_zona

1 Adalberto 2 4
2 Jorge 2 2
3 Gerardo 2 4
4 Hugo 5 1
5 Lucero 3 1
6 Luis 5 1
7 Manuel 2 2
8 Miguel 1 2
9 Pedro 1 1
10 Teofilo 3 3

Un representante puede tener varios vendedores en varias zonas.

La tercera tabla maneja lo que serían los productos vendidos por cada vendedor de cierta tienda en cierta fecha:

Productos

clave_pro | clave_ven | clave_tienda | fecha

1 5 15 15/06/2006
2 2 8 15/06/2006
3 1 8 15/06/2006
4 9 1 15/06/2006
5 3 8 15/06/2006

Ahora el procedure que hice haría esto:

Explicado en palabras: Dime cuantos productos vendio cada vendedor de cada representante en cada tienda de cada día del mes actual de cada estado
Formando una tabla así:

Clave rep | clave_ven | clave_zona | clave_tienda | clave_producto | fecha | CantProductos | Precio_producto

1 1 1 1 1 01/01/2006 2 150.00
1 1 1 1 2 01/01/2006 0 75.59
1 1 1 1 3 01/01/2006 15 15.00
1 1 1 2 1 01/01/2006 15 227.99
1 1 1 2 2 01/01/2006 0 527.55
1 1 1 2 3 01/01/2006 0 239.15
1 1 2 1 1 01/01/2006 10 25.65
1 1 2 1 2 01/01/2006 5 7.50
1 1 2 1 3 01/01/2006 27 50.00
etc....

El ahora bien, esta tabla tiene una estructura así por que será utilizada dentro de un cubo, en postgresql utilizaría una función y se termino. En sql server veo que las funciones; no pueden insertar, actualizar ni borrar información de las tablas por lo que converti mi función en un procedimiento y asunto arreglado.
Puedes decirme como puedo hacer el query sin usar la función por favor. No te preocupes que solo me des un ejemplo de estas tres tablas. Incluso si tu haces unas que solo tengan 3 valores cada una con eso será suficiente. Aprendo bastante rápido y son autodidacta por lo que solo necesitaría que me mostrarás tu query de como lo harías, para 3 valores en cada tabla, con eso es más que suficiente para mí.
Como te imaginarás he puesto las columnas que uso de cada tabla, y aunque el vendedor no haya vendido nada de ese producto este debe aparecer en cero. Por ello al final la tabla resultante tiene como 5 millones de registros.
Crees que con esto puedas ayudarme?; tengo mucha curiosidad de ver como quedaría esto sin necesidad de un procedimiento o función en el SQL SERVER.
Por cierto tengo el SQL SERVER 2000.

Te pongo esto en la página y ya te envíe el archivo de esta misma explicación en txt por que estoy segura que esto no se verá correctamente en la página.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Recorrer un cursor

Publicado por Isaías (5072 intervenciones) el 09/05/2006 16:56:28
Bueno, analizando, si quieres EL TOTAL DE PRODUCTOS vendidod por cada VENDEDOR, agrupado por REPRESENTANTE, TIENDA, DIA (del mes), ESTADO, es muy claro que es una SUMA de la tabla PRODUCTOS VENDIDOS

SELECT clave_ven , nombre , clave_pro, clave_tienda, DATEPART(dd,fecha), COUNT(clave_pro)
FROM PRODUCTOS_VENDIDOS
WHERE DATEPART(mm,fecha) = DATEPART(mm,GETDATE())
GROUP BY clave_ven , clave_pro, clave_tienda, DATEPART(dd,fecha)

Hasta aqui, tienes las VENTAS agrupadas por CLAVE_VEN, CLAVE_PRO, CLAVE_TIENDA, DATEPART(dd,fecha) = Dia del Mes.

Si quieres agregar a esta consulta, el REPRESENTANTE y los NOMBRES de tus VENDEDORES, solo debes hacer un JOIN y agregar en la lista de columnas, lo que quieras aparecer, ejemplo: (Con VENDEDORES)

SELECT clave_ven , nombre , clave_pro, clave_tienda, DATEPART(dd,fecha), COUNT(clave_pro)
FROM PRODUCTOS_VENDIDOS
JOIN VENDEDORES ON PRODUCTOS_VENDIDOS.clave_ven = VENDEDORES.clave_ven
WHERE DATEPART(mm,fecha) = DATEPART(mm,GETDATE())
GROUP BY clave_ven , clave_pro, clave_tienda, DATEPART(dd,fecha)

Espero haberme explicado.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar