viernes, 12 de octubre de 2012

Manejo de Cursores en Microsoft SQL Server


 
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:
 
 

No hay comentarios:

Publicar un comentario