Cuando trabajamos con bases de datos estamos operando sobre un conjunto completo de registros o filas. Por ejemplo, el conjunto de filas devuelto por una instrucción SELECT consta de todas las filas que satisfacen las condiciones del WHERE de esta misms instrucción. Este conjunto completo de filas devuelto por la instrucción se conoce como el conjunto de resultados.
Algunas aplicaciones suelen no funcionar de manera eficaz con el conjunto de resultados completo si son tomados como una unidad. Estas aplicaciones necesitan un mecanismo que les posibilite trabajar con una fila o un pequeño bloque de filas a la vez. Es en este tipo de escenarios donde los cursores entran en acción.
¿Qué es un cursor?
Un cursor es un objeto que permite recorrer las filas o registros de un conjunto de resultados y además permite procesar individualmente o en bloques reducidos dichas filas devueltas por una consulta.
Ciclo de vida de un cursor en SQL
Este es el proceso básico a seguir para implementar un cursor en SQL:
Ciclo de vida de un cursor en SQL |
Para entender mejor cada parte, recurriremos a un ejemplo práctico muy sencillo.
Supongamos que tenemos una base de datos cualquiera y dentro de ella una tabla llamada "Producto" (a continuación facilitamos el script para la creación de la misma e inserción de unos 9 registros)
Tabla Producto |
CREATE TABLE Producto
(
ProductoId INT IDENTITY(1, 1)
, Nombre VARCHAR(50)
, Descripcion VARCHAR(100)
, FechaRegistro DATETIME
, Precio DECIMAL(18, 2)
, Activo BIT
)
INSERT INTO Producto(Nombre, Descripcion, FechaRegistro, Precio, Activo)
VALUES ('Leche', 'Leche LALA', GETDATE(), 15, 1)
, ('Queso', 'Un queso chido', GETDATE(), 20, 1)
, ('Jabón', 'ZOTE para perro', GETDATE(), 12, 1)
, ('Agua', 'Agua natural', GETDATE(), 10, 1)
, ('Jugo', 'Jugo de mango', GETDATE(), 14, 0)
, ('Fresa', 'Fresa con crema', GETDATE(), 25, 0)
, ('Ovni', 'Un Ovni jaja', GETDATE(), 100000, 1)
, ('Confleis', 'La leche va primero xd', GETDATE(), 34, 1)
, ('Aceite', '123', GETDATE(), 40, 0)
SELECT * FROM Producto {codeBox}
Declaración de un cursor
Antes de todo, declararemos dos variables que contengan al nombre del producto y la descripción, para luego declarar el cursor como tal que contenga el resultado de una consulta que recupere el nombre del producto y la descripción de nuestra tabla Producto:
-- VARIABLES PARA GUARDAR INFO
DECLARE @Nombre varchar(400)
DECLARE @Descripcion varchar(400)
-- DECLARACIÓN DEL CURSOR
DECLARE ProdInfo CURSOR
FOR SELECT Nombre, Descripcion FROM Producto {codeBox}
Apertura de un cursor
OPEN ProdInfo {codeBox}
Recorrido de un cursor
FETCH NEXT FROM ProdInfo INTO @Nombre, @Descripcion
WHILE @@fetch_status = 0
BEGIN
PRINT CONCAT(@Nombre, '+', @Descripcion, ' ', @@fetch_status)
FETCH NEXT FROM ProdInfo INTO @Nombre, @Descripcion
END {codeBox}
Cierre de un cursor
CLOSE ProdInfo {codeBox}
Desalojo de un cursor
DEALLOCATE ProdInfo {codeBox}
En el siguiente video abarcamos más a fondo los múltiples parámetros y funcionalidades disponibles para trabajar con cursores en SQL Server: