Ficha de Cursores en SQL Server
Ficha de Cursores en SQL Server
OPEN nombre_cursor;
________________________________________________________________________________
Gestión II/2024 Carrera de Informática - UMSA
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM nombre_cursor INTO @variable1,
@variable2, ...;
END;
CLOSE nombre_cursor;
DEALLOCATE nombre_cursor;
-- 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;
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;
-- '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
Uso de DECLARE
Declaración del Uso del bloque PL/SQL con
nombre_cursor CURSOR
Cursor la palabra clave CURSOR
FOR SELECT...
Uso de DEALLOCATE
Liberación del No existe el comando
nombre_cursor; para liberar
Cursor DEALLOCATE explícito
memoria
Variables declaradas
Diferencias en Variables declaradas con
explícitamente con tipos de
declaración %TYPE o %ROWTYPE
datos
________________________________________________________________________________
Gestión II/2024 Carrera de Informática - UMSA
• Detalles importantes:
o Oracle utiliza un enfoque más explícito para manejar cursores en
bloques PL/SQL, declarando excepciones y controlando el ciclo de
manera más directa con la palabra clave LOOP.
o SQL Server, en cambio, maneja los cursores con un enfoque más
automático, permitiendo recorrer los resultados con FETCH NEXT
dentro de un ciclo WHILE basado en el valor de
@@FETCH_STATUS.
o En Oracle, no es necesario liberar el cursor con DEALLOCATE, pero
en SQL Server se debe liberar explícitamente de la memoria una vez
utilizado, con el fin de evitar fugas de recursos.
Ambos gestores siguen un flujo similar, pero cada uno tiene su propia
sintaxis y características distintivas que los desarrolladores deben manejar
para asegurar un uso eficiente de los cursores.
DECLARE
@xid_producto INT,
@xnombre VARCHAR(50),
________________________________________________________________________________
Gestión II/2024 Carrera de Informática - UMSA
@xcategoria VARCHAR(100),
@xstock INT,
@zstock INT,
@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
________________________________________________________________________________
Gestión II/2024 Carrera de Informática - UMSA
o Ejecución:
DECLARE
@xid_cliente INT,
@xnombre VARCHAR(50),
@xemail VARCHAR(100),
________________________________________________________________________________
Gestión II/2024 Carrera de Informática - UMSA
@xdireccion VARCHAR(50);
o Ejecución:
________________________________________________________________________________
Gestión II/2024 Carrera de Informática - UMSA
DECLARE
@producto_no VARCHAR(50),
@provedor_no VARCHAR(50);
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);
CLOSE Cliente_Cursor;
DEALLOCATE Cliente_Cursor;
o Ejecución: