Para definirlos de una forma clara se podría decir que son bucle que procesa un DataSet cuando recorres sus elementos con un for(), es decir, es un conjunto de registros que devuelve una sentencia Select.
Cómo funcionan los cursores:
Declararemos una variable de cursor con la sentencia:
Declare NombreCursor Cursor For
Después aplicaremos una sentencia Select para recuperar un conjunto de resultados y procesarlos, también podemos ejecutar la select desde otro SP con un Exec y abrimos el cursor con :Open NombreCursor
y recuperamos la primera fila del cursor con FECH NEXT:Fetch Next From NombreCursor Into @Var1, @Var2
donde Var1, Var2 ... Varn son las variables donde se dejaran los datos extraidos de la sentencia select, se han de poner tantas variables como campos se devuelvan de la sentencia select y en el mismo orden.Una vez abierto el cursor comprobamos que todo funcione correctamente y recuperamos el resto de los datos para esto utilizamos un WHILE ...FETCH de la siguiente forma:
While @@FETCH_STATUS = 0
Begin
........
Fetch Next From NombreCursor
Into @Var1, @Var2
End
@@FETCH_STATUS
puede tener los siguientes valores dependiendo del resultado de la consulta:Valor - definición
0 - La instrucción FETCH se ejecutó correctamente.
-1 - La instrucción FETCH ha finalizado con error o la fila estaba más allá del conjunto de resultados.
-2 - Falta la fila recuperada.
y por ultimo cerraremos el cursor y liberamos los recurso utilizados.
Ejemplo.
Este ejemplo es uno muy común que se encuentra en todas las webs "recordar contraseña", ¿ quién no ha olvidado la contraseña alguna vez ?.
Supongamos que un usuario se ha dado de alta mas de una vez con el mismo email y diferentes logins, bien, con este Stored Procedures con cursores podremos enviarle todos sus usuarios con sus passwords en un mismo mail. La explicación de SP está entre el código en color verde, si queréis probar el SP solo teneis que hacer Copy & Paste.
Create Procedure recordar_password
-- Recibimos desde un programa exterior el mail-- del usuario al que se le ha de enviar sus datos
@email varchar(250)
As
-- sMensaje, es el mensaje que enviaremos con los datos
Declare @sMensaje varchar(1000)
-- Declaramos variable para el retorno de carro y el salto de linea-- y le asignamos los valores
Declare @CRLF varchar(100)
Select @CRLF = Char(10) + Char(13) + Char(10) + Char(13)
-- logins y passwords de un usuario
Declare @Login varchar(20)
Declare @Pass varchar(20)
-- extraer los logins y passwords de un usuario concreto
Declare CursorUsuarios Cursor For
-- Realizamos la Select para extraer los datos del usuarioSelect Login, contrasena From pr_usuarios where email = @email
-- Abrimos el cursorOpen CursorUsuarios
-- Devolvemos la primera fila de resultados del cursor en las-- variables que hemos declarado anteriormente
Fetch Next From CursorUsuarios
Into @Login, @Pass
if @@FETCH_STATUS = 0
Begin
Select @sMensaje = 'Su Login y Password. '
Select @sMensaje = @sMensaje + @CRLF
While @@FETCH_STATUS = 0
Begin
-- que el usuario tiene.
Select @sMensaje = @sMensaje + 'Sus datos de acceso son:' + Char(13)
Select @sMensaje = @sMensaje + ' Login : ' + @Login + Char(13)
Select @sMensaje = @sMensaje + ' Password : ' + @Pass + @CRLF
Select @sMensaje = @sMensaje + ' ------------------------' + @CRLF
Fetch Next From CursorUsuarios
Into @Login, @Pass
End
-- se envia un mail con sus datos
Exec master.dbo.xp_sendmail
@recipients = @email,
@subject = 'Sus Datos de acceso',
@message = @sMensaje
End
Close CursorUsuarios
-- Quita la referencia al cursor y el SQL Server libera la-- estructura de datos ocupada por el cursor.
Deallocate CursorUsuarios
Y esto es todo, feliz programming!!Saludos
Alex.