CURSORES EN SQL SERVER – PARTE I
Los cursores en SQL Server pueden definirse como un elemento que representará a un conjunto de datos determinado
por una consulta T-SQL. Los cursores permiten recorrer fila a fila, leer y eventualmente modificar dicho conjunto de
resultados. Existe una amplia variedad de opciones y de funciones para crear y operar sobre cursores en SQL Server.
La creación y utilización de un cursor estará compuesta, como es de esperarse, por una serie de instrucciones T-SQL, las
cuales podrán separarse en grupos bien diferenciados. Estos son: Declaración, Apertura, Acceso a datos, Cierre y Desalojo.
A continuación, detallamos cada grupo de instrucciones.
Declaración
El primer paso constará de la declaración del cursor, donde se indicarán (junto con el nombre del cursor) la consulta que
el mismo representará y algunas otras características bastante interesantes.
DECLARE NOMBRECURSOR CURSOR [LOCAL|GLOBAL|SCROLL]
FOR [CONSULTA T-SQL]
Donde NOMBRECURSOR representa el nombre del cursor y la sentencia [CONSULTA T-SQL] es el conjunto de datos del mismo.
Las sentencias LOCAL permiten que el cursor sea visto solo dentro del procedimiento o trigger que lo usa, GLOBAL es para
que cualquiera pueda usarlo, SCROLL permite navegar dentro del cursor.
Apertura
La apertura del cursor ejecutará la consulta definida en el paso previo y cargará los datos en el mismo. La función OPEN
de T-SQL permite efectuar esta terea. Para continuar con el ejemplo previo, la forma de abrir el cursor será la siguiente:
OPEN NOMBRECURSOR
Recorrido del cursor y acceso a los datos
Este paso consta de recorrer los resultados del cursor. La instrucción FETCH permite efectuar dicha operación. Las filas
leídas podrán copiarse a variables utilizando la sentencia INTO en combinación con la sentencia FETCH, por ejemplo:
FETCH [NEXT|PRIORI|LAST|FIRST] FROM NOMBRECURSOR INTO @VARIABLE
La sentencia anterior, toma la siguiente fila de resultados del cursor y lo aloja en la variable @VARIABLE.
Un detalle a comentar es que en la sentencia INTO (como puede verse en el ejemplo anterior) el mapeo entre columnas
del cursor y variables se realiza implícitamente, asignándose la primera columna a la primera variable, la segunda columna
a la segunda variable y así sucesivamente. Esto implica que deberán crearse tantas variables como columnas se definan
en la declaración del cursor y las mismas deberán ubicarse en el mismo orden que se encuentran definidas las columnas
en la sentencia SELECT de la declaración.
Cierre del cursor
En el cierre del cursor se liberarán los registros tomados por el mismo. Una vez que el cursor es cerrado ya no podrá
recorrerse el conjunto de resultados hasta que el mismo sea reabierto, la sentencia CLOSE cerrará un cursor abierto y la
sintaxis puede verse a continuación:
--Cierre del cursor
CLOSE NOMBRECURSOR
--Liberamos la memoria
DEALLOCATE NOMBRECURSOR
Ejemplos:
1. Crear un cursor para la tabla empleados de la base de datos NEPTUNO, que muestre el recorrido de toda la tabla.
--DECLARACION DEL CURSOR
DECLARE CREMPLEADOS CURSOR
FOR SELECT * FROM EMPLEADOS
--APERTURA DEL CURSOR
OPEN CREMPLEADOS
--RECORRIDO
FETCH NEXT FROM CREMPLEADOS
--CIERRE DEL CURSOR
CLOSE CREMPLEADOS
--LIBERAMOS LA MEMORIA
DEALLOCATE CREMPLEADOS
2. Crear un cursor que permita asignar a dos variables los nombres y apellidos de los empleados. Validar que no se
muestren otros campos que no sean los solicitados.
--DECLARACION DE VARIABLES
DECLARE @NOMBREEMPLEADO VARCHAR(50), @APELLIDOS VARCHAR(50)
--DECLARACION DEL CURSOS
DECLARE CREMPLEADOS CURSOR
FOR SELECT [NOMBRE],[APELLIDOS] FROM EMPLEADOS
--APERTURA
OPEN CREMPLEADOS
--RECORRIDO Y ASIGNACION A LAS VARIABLES
FETCH NEXT FROM CREMPLEADOS INTO @NOMBREEMPLEADO,@APELLIDOS
WHILE (@@FETCH_STATUS = 0)
BEGIN
PRINT @NOMBREEMPLEADO+', '+@APELLIDOS
FETCH NEXT FROM CREMPLEADOS INTO @NOMBREEMPLEADO,@APELLIDOS
END
--CIERRE
CLOSE CREMPLEADOS
--LIBERACION DE MEMORIA
DEALLOCATE CREMPLEADOS