Llamadas Sp encadenados

25/10/2004 - 19:29 por Pablodegerli | Informe spam
Hola amigos. Tengo una estructura de arbol
a1b1
|-b2
| |--c1
| |--c2
|-b3
Almacenada en una tabla Id_RubroxSubrubro, Id_Rubro, Id_subrubro, Nivel
Quiero realizar lo que seria una baja en cascada, por ejemplo borrado el
nodo b2 y por ende c1 y c2.
En realidad lo que borro son las relaciones, no los nodos.
El problema surge que si hago un sp que para cada nodo hijo, busque sus
propios hijo y los borre, y si hago esto con una funcion que se llame a si
misma, tengo un problema al guardar los datos de la primera tanda de hijos
en un cursor, porque la siguiente llamada al sp con cada uno de los hijos me
trata de abrir un cursor que ya existe. El tema es, los cursores no se
limitan al alcance del sp?
Como siempre, gracias de antemano

Aqui va el codigo

create Procedure Sp_RubroBorraSubrubro
@Id_RubroDel int,
@Id_UsuarioAuditoria int
as

begin tran

Declare @Id_RubroxSubrubro int,
@Id_Rubro int,
@Id_Subrubro int,
@Id_Accion int

Declare curHijos CURSOR
for
Select Id_RubroxSubrubro, Id_Rubro, Id_Subrubro from Rubro_X_Subrubro
where Id_Rubro = @Id_RubroDel
Open curHijos

Fetch next from curHijos
into @Id_RubroxSubrubro, @Id_rubro, @Id_Subrubro

While @@FETCH_STATUS = 0
Begin
exec Sp_RubroBorraSubrubro @Id_SubRubro, @Id_UsuarioAuditoria
Fetch next from curHijos
into @Id_RubroxSubrubro, @Id_rubro, @Id_Subrubro
end

print 'delete from Rubro_x_Subrubro where Id_Subrubro = ' +
str(@Id_RubroDel)

set @Id_Accion = 3
exec SpAuditoria 14, 'Sp_RubroBorraSubrubro', @Id_RubroDel,
@Id_UsuarioAuditoria , @Id_Accion

close curHijos
deallocate curHijos
commit tran
 

Leer las respuestas

#1 Carlos Alfonso García
25/10/2004 - 20:17 | Informe spam
Por lo que veo también tienes en la tabla un campo Nivel,
si usas ese campo para mostrar el nivel dentro del árbol
podrías simplemente borrar los registros que tengan como
padre el código que vas a borrar y de nivel mayor.

Hola amigos. Tengo una estructura de arbol
a1b1
|-b2
| |--c1
| |--c2
|-b3
Almacenada en una tabla Id_RubroxSubrubro, Id_Rubro,


Id_subrubro, Nivel
Quiero realizar lo que seria una baja en cascada, por


ejemplo borrado el
nodo b2 y por ende c1 y c2.
En realidad lo que borro son las relaciones, no los nodos.
El problema surge que si hago un sp que para cada nodo


hijo, busque sus
propios hijo y los borre, y si hago esto con una funcion


que se llame a si
misma, tengo un problema al guardar los datos de la


primera tanda de hijos
en un cursor, porque la siguiente llamada al sp con cada


uno de los hijos me
trata de abrir un cursor que ya existe. El tema es, los


cursores no se
limitan al alcance del sp?
Como siempre, gracias de antemano

Aqui va el codigo

create Procedure Sp_RubroBorraSubrubro
@Id_RubroDel int,
@Id_UsuarioAuditoria int
as

begin tran

Declare @Id_RubroxSubrubro int,
@Id_Rubro int,
@Id_Subrubro int,
@Id_Accion int

Declare curHijos CURSOR
for
Select Id_RubroxSubrubro, Id_Rubro, Id_Subrubro from


Rubro_X_Subrubro
where Id_Rubro = @Id_RubroDel
Open curHijos

Fetch next from curHijos
into @Id_RubroxSubrubro, @Id_rubro, @Id_Subrubro

While @@FETCH_STATUS = 0
Begin
exec Sp_RubroBorraSubrubro @Id_SubRubro, @Id_UsuarioAuditoria
Fetch next from curHijos
into @Id_RubroxSubrubro, @Id_rubro, @Id_Subrubro
end

print 'delete from Rubro_x_Subrubro where Id_Subrubro = ' +
str(@Id_RubroDel)

set @Id_Accion = 3
exec SpAuditoria 14, 'Sp_RubroBorraSubrubro', @Id_RubroDel,
@Id_UsuarioAuditoria , @Id_Accion

close curHijos
deallocate curHijos
commit tran


.

Preguntas similares