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: