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