________________________________________________________________________________
Gestión II/2024 Carrera de Informática - UMSA
CURSORES
1. Comparación entre los gestores Oracle y SQL Server:
• Sintaxis general para crear un cursor almacenado en ORACLE:
-- Declaración de un bloque PL/SQL
DECLARE
-- Declaración del cursor
CURSOR Cursor_Principal IS
SELECT columna1, columna2
FROM tabla1
WHERE condiciones; -- Condiciones opcionales para filtrar los datos
-- Declaración de variables para almacenar los valores obtenidos del cursor
variable1 tabla1.columna1%TYPE;
variable2 tabla1.columna2%TYPE;
BEGIN
-- Abrir el cursor
OPEN Cursor_Principal;
-- Iniciar el ciclo para recorrer las filas del cursor
LOOP
-- Extraer los valores de la fila actual del cursor
FETCH Cursor_Principal INTO variable1, variable2;
-- Verificar si se ha llegado al final del cursor
EXIT WHEN Cursor_Principal%NOTFOUND; -- Salir del ciclo cuando no haya más filas
-- Realizar las operaciones necesarias con los valores obtenidos
DBMS_OUTPUT.PUT_LINE('Columna1: ' || variable1 || ' - Columna2: ' || variable2); --
Ejemplo: imprimir los valores
END LOOP;
-- Cerrar el cursor
CLOSE Cursor_Principal;
END;
• Sintaxis general para crear un cursor almacenado en SQL Server:
-- Declarar las variables necesarias para almacenar los valores obtenidos del cursor
DECLARE
@variable1 DataType, -- Aquí se declara la primera variable, con su tipo de dato correspondiente
@variable2 DataType; -- Aquí se declara la segunda variable, con su tipo de dato correspondiente
-- Declaración del cursor
DECLARE Nombre_Cursor CURSOR FOR
-- Consulta SQL que define los datos que el cursor recorrerá
SELECT columna1, columna2
FROM nombre_tabla
WHERE condiciones; -- Aquí se puede agregar una condición si es necesario
-- Abrir el cursor
OPEN Nombre_Cursor;
-- Iniciar el ciclo para recorrer cada fila del cursor
FETCH NEXT FROM Nombre_Cursor INTO @variable1, @variable2;
________________________________________________________________________________
Gestión II/2024 Carrera de Informática - UMSA
-- 'FETCH NEXT' obtiene la siguiente fila del cursor y asigna los valores a las variables
-- Comienza el ciclo WHILE para recorrer todas las filas del cursor
WHILE @@FETCH_STATUS = 0 -- @@FETCH_STATUS = 0 significa que la lectura fue
exitosa
BEGIN
-- Aquí puedes realizar las acciones necesarias con los datos obtenidos
PRINT 'Columna1: ' + CAST(@variable1 AS VARCHAR(50)); -- Ejemplo: Imprimir el valor
de la primera variable
PRINT 'Columna2: ' + CAST(@variable2 AS VARCHAR(50)); -- Ejemplo: Imprimir el valor
de la segunda variable
-- Obtener la siguiente fila del cursor
FETCH NEXT FROM Nombre_Cursor INTO @variable1, @variable2;
-- Continuar obteniendo los datos hasta que no haya más filas
END
-- Cerrar el cursor
CLOSE Nombre_Cursor; -- Una vez que se hayan procesado todas las filas, se cierra el cursor
-- Liberar el cursor de la memoria
DEALLOCATE Nombre_Cursor; -- Se libera el cursor de la memoria para evitar fugas de recursos
2. Ejemplos de Cursores en SQL Server:
o Los ejemplos se realizarán en base al siguiente Modelo ER:
I. Crea un cursor que recorra todos los productos de la tabla PRODUCTO y
aumente su stock en un 10% si la categoría del producto es ''Tecnología'.
DECLARE
@xid_producto INT,
@xnombre VARCHAR(50),
@xcategoria VARCHAR(100),
@xstock INT,
@zstock INT,
________________________________________________________________________________
Gestión II/2024 Carrera de Informática - UMSA
@cont INT;
-- Inicializar el contador
SET @cont = 0;
-- Declaración del cursor en SQL Server
DECLARE Producto_Cursor CURSOR FOR
SELECT p.id_producto, p.nombre, p.categoria, p.stock
FROM Producto p
GROUP BY p.id_producto, p.nombre, p.categoria, p.stock; -- Se deben
agrupar por todos los campos seleccionados
-- Abrir el cursor
OPEN Producto_Cursor;
-- Iniciar el ciclo para recorrer las filas del cursor
FETCH NEXT FROM Producto_Cursor INTO @xid_producto, @xnombre, @xcategoria,
@xstock;
WHILE @@FETCH_STATUS = 0
BEGIN
-- Imprimir el nombre del producto
PRINT 'Producto: ' + @xnombre;
-- Asignar el valor de stock original
SET @zstock = @xstock;
-- Si la categoría es 'Tecnología', modificar el stock
IF @xcategoria = 'Tecnología' BEGIN
SET @zstock = @xstock + (@xstock * 0.10); -- Incremento del 10%
SET @cont = @cont + 1;
END
-- Mostrar los resultados dependiendo del contador
IF @cont > 1 BEGIN
PRINT ' STOCK MODIFICADO: ' + CAST(@zstock AS VARCHAR) ;
END ELSE
BEGIN
PRINT ' STOCK: ' + CAST(@zstock AS VARCHAR);
END
-- Obtener la siguiente fila del cursor
FETCH NEXT FROM Producto_Cursor INTO @xid_producto, @xnombre,
@xcategoria, @xstock;
END
-- Cerrar y liberar el cursor
CLOSE Producto_Cursor;
o Ejecución:
________________________________________________________________________________
Gestión II/2024 Carrera de Informática - UMSA
________________________________________________________________________________
Gestión II/2024 Carrera de Informática - UMSA
II. Crea un cursor que recorra todos los clientes de la tabla CLIENTE y simule
el envío de un email (mostrando un mensaje con el email y nombre del
cliente) si el cliente vive en una dirección que contiene la palabra 'Calle'.
DECLARE
@xid_cliente INT,
@xnombre VARCHAR(50),
@xemail VARCHAR(100),
@xdireccion VARCHAR(50);
-- Declaración del cursor en SQL Server
DECLARE Cliente_Cursor CURSOR FOR
SELECT c.id_cliente, c.nombre, c.email, c.direccion
FROM Cliente c
-- Abrir el cursor
OPEN Cliente_Cursor;
-- Iniciar el ciclo para recorrer las filas del cursor
FETCH NEXT FROM Cliente_Cursor INTO @xid_cliente, @xnombre, @xemail,
@xdireccion;
WHILE @@FETCH_STATUS = 0
BEGIN
-- Imprimir el nombre del producto
PRINT 'CLIENTE: ' + @xnombre;
-- Si la categoría es 'Tecnología', modificar el stock
IF @xdireccion LIKE 'Calle%' BEGIN
PRINT ' MENSAJE : ' + @xemail+ ' - ' + @xnombre ;
END
-- Obtener la siguiente fila del cursor
FETCH NEXT FROM Cliente_Cursor INTO @xid_cliente, @xnombre,
@xemail, @xdireccion;
END
-- Cerrar y liberar el cursor
CLOSE Cliente_Cursor;
o Ejecución:
________________________________________________________________________________
Gestión II/2024 Carrera de Informática - UMSA
III. Crea un cursor que recorra la tabla SUMINISTRA y muestre el nombre del
proveedor junto con el nombre del producto que suministra.
DECLARE
@producto_no VARCHAR(50),
@provedor_no VARCHAR(50);
-- Declaración del cursor en SQL Server
DECLARE Suministra_Cursor CURSOR FOR
SELECT p.nombre, po.nombre_proveedor
FROM Suministra s,proveedor po, producto p
Where p.id_producto = s.id_producto AND s.id_proveedor =
po.id_proveedor;
________________________________________________________________________________
Gestión II/2024 Carrera de Informática - UMSA
-- Abrir el cursor
OPEN Suministra_Cursor;
-- Iniciar el ciclo para recorrer las filas del cursor
FETCH NEXT FROM Suministra_Cursor INTO @producto_no, @provedor_no;
WHILE @@FETCH_STATUS = 0
BEGIN
-- Imprimir el nombre del producto
PRINT ' Provedor : ' + @provedor_no;
PRINT ' Producto : ' + @producto_no;
PRINT ' '
PRINT
'______________________________________________________________'
FETCH NEXT FROM Suministra_Cursor INTO @producto_no, @provedor_no;
END
-- Cerrar y liberar el cursor
CLOSE Suministra_Cursor;
o Ejecución:
________________________________________________________________________________
Gestión II/2024 Carrera de Informática - UMSA
IV. Crea un cursor que recorra los clientes y, para cada cliente, liste todos los
productos que ha comprado, mostrando el nombre del cliente seguido por
los productos.
DECLARE
@xid_cliente INT,
@xnombre_cliente VARCHAR(50),
@xnombre_pro VARCHAR(50);
-- Declaración del cursor para clientes
DECLARE Cliente_Cursor CURSOR FOR
SELECT c.id_cliente, c.nombre
FROM Cliente c;
-- Abrir el cursor de clientes
OPEN Cliente_Cursor;
-- Iniciar el ciclo para recorrer las filas del cursor de clientes
FETCH NEXT FROM Cliente_Cursor INTO @xid_cliente, @xnombre_cliente;
WHILE @@FETCH_STATUS = 0
BEGIN
-- Imprimir el nombre del cliente
PRINT 'CLIENTE: ' + @xnombre_cliente;
-- Declarar el cursor de productos dentro del ciclo para cada
cliente
DECLARE Producto_Cursor CURSOR FOR
SELECT p.nombre
FROM producto p
WHERE p.id_cliente = @xid_cliente;
-- Abrir el cursor de productos para el cliente actual
OPEN Producto_Cursor;
-- Iniciar el ciclo para recorrer las filas del cursor de
productos
FETCH NEXT FROM Producto_Cursor INTO @xnombre_pro;
WHILE @@FETCH_STATUS = 0
BEGIN
-- Imprimir el nombre del producto
PRINT ' PRODUCTO: ' + @xnombre_pro;
-- Obtener el siguiente producto
FETCH NEXT FROM Producto_Cursor INTO @xnombre_pro;
END
-- Cerrar y liberar el cursor de productos
________________________________________________________________________________
Gestión II/2024 Carrera de Informática - UMSA
CLOSE Producto_Cursor;
DEALLOCATE Producto_Cursor;
-- Obtener el siguiente cliente
FETCH NEXT FROM Cliente_Cursor INTO @xid_cliente, @xnombre_cliente;
END
-- Cerrar y liberar el cursor de clientes
CLOSE Cliente_Cursor;
DEALLOCATE Cliente_Cursor;
o Ejecución: