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

Cursores en PA

Estas en el tema de Cursores en PA en el foro de SQL Server en Foros del Web. Que tal, recientemente aprendi a hacer Procedimientos Almacenados he hice uno donde implemente dos cursores!, bàsicamente son lo mismo: Código HTML: Declare Grupos Cursor For ...
  #1 (permalink)  
Antiguo 30/04/2010, 08:13
 
Fecha de Ingreso: septiembre-2005
Mensajes: 1.289
Antigüedad: 18 años, 7 meses
Puntos: 3
Pregunta Cursores en PA

Que tal, recientemente aprendi a hacer Procedimientos Almacenados he hice uno donde implemente dos cursores!, bàsicamente son lo mismo:

Código HTML:
Declare Grupos Cursor  For
        select cve_grupo from sys_gruposusers where nombre=@usuario

	Declare Grupos2 Cursor  For
        select cve_grupo from sys_gruposusers where nombre=@usuario
pero al ejecutar el PA me marca un error indicandome de que el cursos Grupo2 ya existe, pero si me devuelve los resultados esperados, alguien sabrá el por que me marca ese error?, así empleo los cursores:

(Se puede ocupar un mismo cursos para ambas acciones? estrictamente habalndo hacen lo mismo, que me sugieren?)

Código HTML:
Open Grupos 
	   Fetch Next From Grupos
		   Into @ui_grupo
		   
		   While @@Fetch_Status = 0
				Begin
					--print('ui_Grupo : ' + @ui_grupo);
					set @condicion = N'' + @condicion + ' or usuario='''+@ui_grupo+'''';

					Fetch Next From Grupos
					Into @ui_grupo
			  End     
	Close Grupos
	Deallocate Grupos

-------------

Open Grupos2 
			   Fetch Next From Grupos2
				   Into @ui_grupo_2
				   
				   While @@Fetch_Status = 0
						Begin
							------------------------------
							set @aux_query = N'select @aux=count(cve_empresa) from doc_plantillas_seguridad where usuario='''+@ui_grupo_2+'''';
							Execute sp_executesql @aux_query,N'@aux int output',@empresa_num  output;
							--print('...aux_query : ' + @aux_query);	
							if @empresa_num>0
							begin
								set @query = N'' + @query + 'select cve_docto,nombre from sys_tipos_doctos where Cve_Docto <> ''CA'' and cve_docto in'+ 
									N' (select cve_plantilla from doc_plantillas_seguridad_usr where usuario='''+@ui_grupo_2+''' and usuario in'+
									N' (select usuario from doc_plantillas_seguridad where cve_empresa='''+@cve_empresa+''')) UNION ';
								--print('Query IF 2 : ' + @query);
							end
							else
							begin
								set @query = N'' + @query + 'select cve_docto,nombre from sys_tipos_doctos where Cve_Docto <> ''CA'' and cve_docto in'+ 
											 N' (select cve_plantilla from doc_plantillas_seguridad_usr where usuario='''+@ui_grupo_2+''') UNION ';
								--print('Query ELSE 2 : ' + @query);
							end
							------------------------------

							Fetch Next From Grupos2
							Into @ui_grupo_2
					  End     
			Close Grupos2
			Deallocate Grupos2
Gracias de Antemano!
__________________
Wow! No se que decir...
  #2 (permalink)  
Antiguo 30/04/2010, 08:57
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Respuesta: Cursores en PA

Aca siempre sugerimos no usar cursores, solo usarlos como ultima alternativa.
Qué es lo que intentas hacer?
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #3 (permalink)  
Antiguo 30/04/2010, 09:53
 
Fecha de Ingreso: septiembre-2005
Mensajes: 1.289
Antigüedad: 18 años, 7 meses
Puntos: 3
Respuesta: Cursores en PA

Ho no sabia que no es bueno, por que son solo como último recurso?

Lo que quiero es que verifico si un usuario esta asignado a un "grupo" de usuarios, es decir, si tengo al usuario A y tengo a los grupos X,Y y Z, es posible que ese usuario A este asignado en uno o mas grupos, entonces requiero obtener en que grupos esta asignado el usuario A para generar dinámicamente una cadena que me servira de condición para un Query que posteriormente deberé ejecutar.

No se si me explique, mas que nada ocupo el Cursos con un FOR para obtener los grupos a los que pertenece un usuario.

Saludos y grax por la respuesta, espro mas comens!!
__________________
Wow! No se que decir...
  #4 (permalink)  
Antiguo 30/04/2010, 11:15
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Respuesta: Cursores en PA

Dicen que los cursores consumen muchos recursos y eso hace que el servidor se arruine.
Sinceramente a mi no me consta eso, pero los que tienen mas experiencia lo dicen.
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #5 (permalink)  
Antiguo 30/04/2010, 12:07
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Cursores en PA

A mi si me consta, he llegado (por falta de agricultura, jajajaja, conocimiento) a tirar (se pasman) los servidores........¿porque?, porque se crean en MEMORIA !! y la pueden llegar a saturar.
  #6 (permalink)  
Antiguo 30/04/2010, 12:30
 
Fecha de Ingreso: septiembre-2005
Mensajes: 1.289
Antigüedad: 18 años, 7 meses
Puntos: 3
Respuesta: Cursores en PA

Hoo ya veo, cierto, no son buena opcón, sobre todo en servidores limitados, entonces, tienen alguna sugerencia? algo que tenga una funciòn similar al cursor? el caso es el como hacer que se vaya formando una cadena conforme se obtiene un registro (como un ciclo), alguna idea? :p
__________________
Wow! No se que decir...
  #7 (permalink)  
Antiguo 30/04/2010, 16:05
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Cursores en PA

Dice la teoria que el 99.99% de lo que haces con un cursor, se puede hacer con simple T-SQL, todo seria que nos explicaras bien, que requieres hacer.
  #8 (permalink)  
Antiguo 30/04/2010, 16:18
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Respuesta: Cursores en PA

Bueno, haciendo un esfuerzo sobrehumano, y usando fuerzas extrasensoriales puede hacer algo:
Código SQL:
Ver original
  1. SELECT @condicion = N'' + @condicion + ' or usuario = '''+cve_grupo+''''
  2. FROM sys_gruposusers
  3. WHERE nombre = @usuario
  4.  
  5. SELECT D.cve_docto,D.nombre
  6. FROM sys_gruposusers G
  7. INNER JOIN doc_plantillas_seguridad PS ON G.cve_grupo = PS.usuario
  8. INNER JOIN doc_plantillas_seguridad_usr U ON PS.usuario = U.usuario
  9. INNER JOIN sys_tipos_doctos D ON U.cve_plantilla = D.cve_docto
  10. WHERE G.nombre = @usuario AND D.Cve_Docto <> 'CA'
El resto depende ti.
PD: no se donde usas @condicion.
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #9 (permalink)  
Antiguo 30/04/2010, 16:32
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Cursores en PA

Yo agregaira, casi SOBRE-NATURAL, jajaja, saludos
  #10 (permalink)  
Antiguo 01/05/2010, 10:46
 
Fecha de Ingreso: septiembre-2005
Mensajes: 1.289
Antigüedad: 18 años, 7 meses
Puntos: 3
Respuesta: Cursores en PA

Hola Hola, gracias por el ejemplo SOBRE-NATURAL :p vacha, ammm nunca he usado los INNER, voy a jugar un poco con eso que me proponen y regresare con mis resultados, muchas gracias flaviovich!! este foro sigue siendo el mejor que he encontrado!!!
__________________
Wow! No se que decir...
  #11 (permalink)  
Antiguo 07/05/2010, 07:46
 
Fecha de Ingreso: septiembre-2005
Mensajes: 1.289
Antigüedad: 18 años, 7 meses
Puntos: 3
Pregunta Respuesta: Cursores en PA

Que tal de nuevo molestando, saben, el segundo CURSOR no lo pude quitar,flaviovich me hizo el favor de ponerme los dos quers que equivalen a mis dos cursores, pero como el segundo (el mas grande) ejecuta una serie de acciones segùn sea el caso y aun no tengo la capacodad de encontrar su equivalente como lo intento flaviovich (que por desgracia no arroja nada como esta y no comprendo lo de los INNER ) , por ahora almenos quisiera eliminar el error que me sigue enviando:

Ya existe un cursor con el nombre 'Grupos'.

Quiero suponer que se crea el cursor, se ejecuta y al finalizar este se cierra y despues elimina con

Close Grupos
Deallocate Grupos

pero es como si no lo hiciera, leyendo muchas pàginas ponen que para borrar un CURSOR se usa Drop [nombre_cursor], pero en sus ejemplos siempre usan el DEALLOCATE, hay otro modo borrar el cursor? o por que me marca ese error?
__________________
Wow! No se que decir...

Última edición por zyon; 07/05/2010 a las 07:56
  #12 (permalink)  
Antiguo 11/05/2010, 10:24
 
Fecha de Ingreso: septiembre-2005
Mensajes: 1.289
Antigüedad: 18 años, 7 meses
Puntos: 3
Respuesta: Cursores en PA

Que tal amigos, entonces? no hay nada sobre algún metodo para eliminar un Cursor despues de que cumple su función? :(
__________________
Wow! No se que decir...
  #13 (permalink)  
Antiguo 11/05/2010, 10:25
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Cursores en PA

No existe otro metodo y como ya dijimos, no son recomendados los cursores
  #14 (permalink)  
Antiguo 11/05/2010, 10:54
 
Fecha de Ingreso: septiembre-2005
Mensajes: 1.289
Antigüedad: 18 años, 7 meses
Puntos: 3
Respuesta: Cursores en PA

Ok, tratare de tomar el problema y resolverlo desde otra perspectiva, pero algo mas, por que en internet poner que para borrar un CURSOR usan DROP CURSOR [nombre-cursor] y en sus ejemplos solo utilizan DEALLOCATE [nombre-cursor]?
__________________
Wow! No se que decir...
  #15 (permalink)  
Antiguo 11/05/2010, 11:54
 
Fecha de Ingreso: septiembre-2005
Mensajes: 1.289
Antigüedad: 18 años, 7 meses
Puntos: 3
Respuesta: Cursores en PA

Hola de nuevo!! me parece que lo he corregido, mi cursor original estaba así:

Declare Grupos999 Cursor For
select cve_grupo from sys_gruposusers where nombre=@usuario


pero encontre una palabra que agregarle a la declaración del cursor, la de "LOCAL" así:

Declare Grupos999 Cursor local For
select cve_grupo from sys_gruposusers where nombre=@usuario

lo encontre por pura suerte, quiero suponer que la palabra LOCAL hace referencia a que es un cursor que solo se ejecuta en la base de datos que posee el PA, por que tengo otra BD que usa el mismo PA. Bueno, si alguien puede complementar lo de LOCAL bienvenido!! Gracias por todo :)
__________________
Wow! No se que decir...
  #16 (permalink)  
Antiguo 11/05/2010, 22:06
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Cursores en PA

Estas "revolviendo" sentencias de SQL de otras bases de datos, no es lo mismo aplicar sentencias en ORACLE, ACCESS y SQL Server, incluso, algunas cambian en MYSQL
  #17 (permalink)  
Antiguo 12/05/2010, 06:00
 
Fecha de Ingreso: septiembre-2005
Mensajes: 1.289
Antigüedad: 18 años, 7 meses
Puntos: 3
Respuesta: Cursores en PA

Te refieres por la palabra "local" ? Por que lo encontre declarado en un archivo de word que se supone era sobre cursores en sql server... :s y bueno, aplicandolo, me soluciono el problema de que ya existia un cursor con el nombre 'Grupos'
__________________
Wow! No se que decir...
  #18 (permalink)  
Antiguo 12/05/2010, 09:51
Avatar de mauro_bernal_rios  
Fecha de Ingreso: abril-2008
Ubicación: Mendoza
Mensajes: 88
Antigüedad: 16 años
Puntos: 2
Respuesta: Cursores en PA

Porque los cursores son buenos o malos
http://www.sqlgurus.org/SQLGURUS/Los...os+o+malos.doc

Este texto es muy util para entender porque no sirven los cursores.
Sin embargo al ver lo malo de los cursores, te da una idea de cuando usarlos:

Yo los uso habitualmente cursores ya que puedo agregar detalles (como cantidad, campos usados, tiempos, bifurcaciones, condicionales, etc...) que en una simple consulta no puedes (y si puedes eres un genio total) y el tiempo y recurso consumido es tolerable y se compensa con el resultado final.
Ademas los uso para tareas ocasionales.
__________________
Mauro Bernal
Sistemas y Web
http://maurobernal.com.ar
[email protected]
  #19 (permalink)  
Antiguo 12/05/2010, 11:08
 
Fecha de Ingreso: septiembre-2005
Mensajes: 1.289
Antigüedad: 18 años, 7 meses
Puntos: 3
Respuesta: Cursores en PA

Gracias por tu comen mauro_bernal_rios, precisamente de esa pàgina es donde encontre lo que me ayudo a solucionar mi problema con el cursor, y si tienes razón, utilice el cursor por que requería ciertas acciones en especial, seguramente habra manera de no usarlo, pero por ahora no soy un "genio" y no tengo mucha practica, aunque no quita el que tratre de elimnarlo y sustituirlo con algo mas!

Saludos!
__________________
Wow! No se que decir...

Etiquetas: Ninguno
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 19:04.