Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Procedimiento almacenado recursivo (https://www.clubdelphi.com/foros/showthread.php?t=14079)

williammoreno 09-09-2004 02:57:46

Procedimiento almacenado recursivo
 
Hola a todos:

Mi problema es que deseo crear un procedimiento almacenado recursivo. En este procedimiento declaro el cursor cur_ActActividad. Cuando el procedimiento inicia la primera ejecución crea dicho cursor y cuando se llama a sí mismo el procedimiento intenta volver a crear el mismo cursor por lo tanto me marca el error que el cursor ya existe, debido que el cursor es global en la conexión. Abajo les adjunto el código del procediento en mención.

Que estrategia me sugieren uds. para superar este problema?
Código SQL [-]
CREATE PROC sp_VlrActProducto @IdActividad INT, @StrCriterio TEXT,@Año INT, @Mes SMALLINT
AS
DECLARE @actPadre INT DECLARE @VlrActAct FLOAT DECLARE @TotActAct FLOAT DECLARE @Resultado FLOAT DECLARE @Total FLOAT DECLARE cur_ActActividad CURSOR FOR SELECT IdActOrigen, VlrActAct FROM cstActActividad WHERE AñoActAct = @Año AND MesActAct = @Mes AND IdActDestino = @IdActividad AND IndHabilitado = 1 SELECT @Total = 0 OPEN cur_ActActividad FETCH NEXT FROM cur_ActActividad INTO @actPadre, @VlrActAct IF (@@FETCH_STATUS = 0) BEGIN
WHILE (@@FETCH_STATUS = 0) BEGIN
SELECT @TotActAct = SUM(VlrActAct) FROM cstActActividad WHERE AñoActAct = @Año AND MesActAct = @Mes AND IdActOrigen = @actPadre AND IndHabilitado = 1 EXEC @Resultado = sp_VlrActProducto @actPadre, @strCriterio, @Año, @Mes IF PATINDEX ('%;' + CONVERT(VARCHAR,@actPadre) + ';%', @StrCriterio) > 0
SELECT @Total = @Total + ( @VlrActAct + @Resultado) * @VlrActAct / @TotActAct
ELSE
SELECT @Total = @Total + @Resultado * @VlrActAct / @TotActAct
FETCH NEXT FROM cur_ActActividad INTO @actPadre, @VlrActAct
END
END ELSE
SELECT @total = 0
CLOSE cur_ActActividad DEALLOCATE cur_ActActividad RETURN(@Total)
Gracias por su colaboración !!

williammoreno 23-09-2004 21:02:46

Hola, soy yo nuevamente.

Por favor a quien pueda darme una orientación para resolver mi problema se lo agradeceré!

Faithless 03-02-2016 16:18:48

mm
 
Cuando se intentan crear procedimientos almacenados con SQLServer en caso de que existan cursores en el procedimiento en cuestión, aparecerá un error que indicará que el CURSOR XXX está abierto y que no es posible abrirlo nuevamente.

Este error se debe a que los cursores son globales a nivel de base de datos, la forma de solucionarlo es ir a Propiedades de la base de datos, sección Opciones y modificar el valor del Cursor predeterminado (Default cursor) de GLOBAL a LOCAL, con esta acción ya no aparecerá el problema en la recusividad con cursores.


La franja horaria es GMT +2. Ahora son las 07:31:26.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi