Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-09-2004
williammoreno williammoreno is offline
Miembro
 
Registrado: dic 2004
Posts: 11
Poder: 0
williammoreno Va por buen camino
Question 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 !!

Última edición por Casimiro Notevi fecha: 03-02-2016 a las 18:22:50.
Responder Con Cita
  #2  
Antiguo 23-09-2004
williammoreno williammoreno is offline
Miembro
 
Registrado: dic 2004
Posts: 11
Poder: 0
williammoreno Va por buen camino
Hola, soy yo nuevamente.

Por favor a quien pueda darme una orientación para resolver mi problema se lo agradeceré!
Responder Con Cita
  #3  
Antiguo 03-02-2016
Faithless Faithless is offline
Registrado
NULL
 
Registrado: feb 2016
Posts: 1
Poder: 0
Faithless Va por buen camino
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.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 08:13:18.


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
Copyright 1996-2007 Club Delphi