Pro Blogger Templates

¿Qué son y cómo se utilizan los cursores en SQL Server?

Cursores en SQL

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


Artículo Anterior Artículo Siguiente