Compartir a través de


Manejo de Cursores en SQL Server (es-ES)

CURSORES

Un cursor es una estructura de datos creada en memoria RAM producto de una sentencia SELECT y que nos permite navegar dentro de las filas para obtener la información.

Cuando trabajemos con cursores debemos seguir los siguientes pasos.
-Declarar el cursor, utilizando DECLARE 
-Abrir el cursor, utilizando OPEN 
-Leer los datos del cursor, utilizando FETCH ... INTO 
-Cerrar el cursor, utilizando CLOSE
-Liberar el cursor, utilizando DEALLOCATE

use northwind go --Declarando el cursor Declare Cursor1 Cursor scroll for select * from dbo.customers --Abrir el cursor Open Cursor1 --Navegar Fetch first from Cursor1 --cerrar el cursor Close Cursor1 --liberar de memoria Deallocate Cursor1

 

La sintaxis general para trabajar con un cursor es la siguiente.

-- Declaración del cursor
DECLARE[NOMBRE CURSOR]CURSOR[ LOCAL | GLOBAL ] [ FORWARD_ONLY | SCROLL ] FOR [SENTENCIA DE SQL (SELECT)]
-- Apertura del cursor
OPEN[NOMBRE CURSOR] 
-- Lectura de la primera fila del cursor
FETCH[NOMBRE CURSOR]INTO[LISTA DE VARIABLES DECLARADAS]
WHILE(@@FETCH_STATUS= 0) BEGIN 
-- Lectura de la siguiente fila de un cursor
FETCH[NOMBRE CURSOR]INTO[LISTA DE VARIABLES DECLARADAS] ...
-- Fin del bucle WHILE
END

-- Cierra el cursor
CLOSE[NOMBRE CURSOR]
-- Libera los recursos del cursor
DEALLOCATE
[NOMBRE CURSOR]

El siguiente ejemplo muestra un ejemplo de cursor usando la base de datos northwind.

----Ejemplo 2 Cursores Declare @codigo varchar(5), @compania varchar(200), @contacto varchar(150), @pais varchar(100) Declare ccustomers cursor GLOBAL for Select customerid, companyname, contactname , country from customers Open ccustomers fetch ccustomers into @codigo, @compania, @contacto, @pais while(@@fetch_status=0) begin print @codigo +' '+ @compania +' '+ @contacto +' '+@pais fetch ccustomers into @codigo, @compania, @contacto, @pais end close ccustomers deallocate ccustomers GO

Cuando trabajamos con cursores, la función @@FETCH_STATUS nos indica el estado de la última instrucción FETCH emitida, los valores posibles son:

Valor devuelto Descripción
0 La instrucción FETCH se ejecutó correctamente.
-1 La instrucción FETCH no se ejecutó correctamente o la fila estaba más allá del conjunto de resultados.
-2 Falta la fila recuperada.

Para actualizar los datos de un cursor debemos especificar FOR UPDATE después de la sentencia SELECT en la declaración del cursor, y WHERE CURRENT OF [Nombre Cursor] en la sentencia UPDATE tal y como muestra el siguiente ejemplo.

----Ejemplo 3 Cursores Actualizar datos Declare @codigo varchar(5), @compania varchar(200), @contacto varchar(150), @pais varchar(100) Declare ccustomers cursor GLOBAL for Select customerid, companyname, contactname , country from customers FOR UPDATE Open ccustomers fetch ccustomers into @codigo, @compania, @contacto, @pais while(@@fetch_status=0) begin UPDATE customers set companyname = @compania + '(Modificado)' where current of ccustomers fetch ccustomers into @codigo, @compania, @contacto, @pais end close ccustomers deallocate ccustomers go

En la apertura del cursor, podemos especificar los siguientes parámetros:

  DECLARE<nombre_cursor>CURSOR [ LOCAL | GLOBAL ] [ FORWARD_ONLY | SCROLL ][ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] [ TYPE_WARNING ] FOR Sentencia_sql

Para consultar cada parámetro el link es:

http://msdn.microsoft.com/es-es/library/ms180169.aspx