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