Cursores con variables tipo tabla

Cursores con variables tipo tabla

Este artículo muestra como se puede trabajar con un cursor y llenar los datos de este en una tabla tipo variable. (Ver Tablas tipo variable).

Los cursores permiten guardar en memoria el resultado de una instrucción Select y analizar los registros de manera individual. Para ver cursores pulse en Ver cursores. 



Ejercicios

Usando Northwind

use Northwind
go

1. Como crear un cursor que muestre el código del empleado y el número de ordenes de pedido emitidas

Declare @EmpleadosOrdenes table
( EmpleadoCodigo nchar(5),
EmpleadoNombreCompleto nvarchar(100),
EmpleadoCantidadOrdenes int
)
— Definir las variables
declare @EmpleadoCodigo nchar(5)
declare @EmpleadoNombreCompleto nvarchar(100)
declare @EmpleadoCantidadOrdenes int
— Crear el cursor
declare cursorEmpleadosOrdenes cursor for
select Right(‘0000’ + LTrim(Str(E.EmployeeID)),5) As ‘Código’,
Empleado = E.LastName + Space(1) + E.FirstName,
count(O.OrderID) As ‘Cantidad’
from Employees As E
join Orders As O on E.EmployeeID = O.EmployeeID
group by E.EmployeeID, E.LastName + Space(1) + E.FirstName
— Abrir el cursor
open cursorEmpleadosOrdenes
— Leer los datos a las variables del primer registro
fetch next from cursorEmpleadosOrdenes
into @EmpleadoCodigo,@EmpleadoNombreCompleto, @EmpleadoCantidadOrdenes
while @@FETCH_STATUS =0 — recorrer el cursor
begin
insert @EmpleadosOrdenes values (@EmpleadoCodigo,@EmpleadoNombreCompleto, @EmpleadoCantidadOrdenes)
fetch next from cursorEmpleadosOrdenes
into @EmpleadoCodigo,@EmpleadoNombreCompleto, @EmpleadoCantidadOrdenes
end
close cursorEmpleadosOrdenes
deallocate cursorEmpleadosOrdenes
select * from @EmpleadosOrdenes order by EmpleadoCantidadOrdenes desc
go

La figura muestra el resultado de la ejecución del cursor.

2.Crear un cursor que muestre un producto y la cantidad de unidades vendidas y el monto total generado.

— Crear la variable tipo tabla
Declare @ProductosTotales table
(ProductoCodigo nchar(5), ProductoDescripcion nvarchar(50),
ProductoTotalUnidades Numeric(9,2), ProductosMontoTotal Numeric(9,2))
— Crear las variables para que el cursos guarde los datos
declare @ProductoCodigo nchar(5)
declare @ProductoDescripcion nvarchar(50)
declare @ProductoTotalUnidades Numeric(9,2)
declare @ProductosMontoTotal Numeric(9,2)
— Crear el cursor
declare CursorProductosTotales cursor for
select Right(‘0000’ + LTrim(Str(P.ProductID)),5) As ‘Código’,
P.ProductName As ‘Descripción’,
Sum(D.Quantity) As ‘Cantidad’,
Sum(D.Quantity * D.UnitPrice) As ‘Monto Total’
from Products As P
join [Order Details] As D on P.ProductID = D.ProductID
group by P.ProductID, P.ProductName
open CursorProductosTotales
fetch next from CursorProductosTotales into @ProductoCodigo, @ProductoDescripcion,
@ProductoTotalUnidades, @ProductosMontoTotal
— Recorrer el cursor
while @@fetch_status = 0
begin
insert @ProductosTotales values (@ProductoCodigo, @ProductoDescripcion,
@ProductoTotalUnidades, @ProductosMontoTotal)
fetch next from CursorProductosTotales into @ProductoCodigo, @ProductoDescripcion,
@ProductoTotalUnidades, @ProductosMontoTotal
end
close CursorProductosTotales
deallocate CursorProductosTotales
select * from @ProductosTotales
go