0% encontró este documento útil (0 votos)
2 vistas14 páginas

Ficha de Cursores en SQL Server

El documento proporciona una guía sobre el uso de cursores en SQL Server, describiendo su funcionamiento y sintaxis básica. Se comparan los cursores en SQL Server con los de Oracle, destacando diferencias en la declaración, apertura, recuperación de filas y liberación de recursos. Además, se incluyen ejemplos prácticos de cursores para manipular datos en tablas de productos y clientes.

Cargado por

eescobare
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
2 vistas14 páginas

Ficha de Cursores en SQL Server

El documento proporciona una guía sobre el uso de cursores en SQL Server, describiendo su funcionamiento y sintaxis básica. Se comparan los cursores en SQL Server con los de Oracle, destacando diferencias en la declaración, apertura, recuperación de filas y liberación de recursos. Además, se incluyen ejemplos prácticos de cursores para manipular datos en tablas de productos y clientes.

Cargado por

eescobare
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 14

________________________________________________________________________________

Gestión II/2024 Carrera de Informática - UMSA

CURSORES EN SQL SERVER


1. Descripción general
Un cursor en SQL Server se utiliza para recorrer filas devueltas por una
consulta y procesarlas de manera individual. Los cursores son útiles cuando es
necesario realizar operaciones fila por fila en lugar de trabajar con conjuntos
completos de datos.
En SQL Server, podemos trabajar con cursores mediante los siguientes pasos
básicos:

1) Declaración del cursor: Se define el cursor basado en una consulta


SELECT.
2) Apertura del cursor: Ejecuta la consulta y carga los resultados en el
cursor.
3) Recuperación de datos: Recorremos las filas una a una utilizando
FETCH.
4) Cierre del cursor: Cerramos el cursor después de procesar los datos.
5) Liberación del cursor: Eliminamos el cursor de la memoria.

2. Sintaxis básica de cursores en SQL Server


La sintaxis básica para trabajar con cursores es la siguiente:
Primero Se declara un cursor “ejemplo1”. El cursor permite iterar sobre el
conjunto de resultados de una consulta.

DECLARE ejemplo1 CURSOR FOR

Luego definimos las consultas que queramos realizar.Se puede


seleccionar multiples columnas y apliar las condiciones que necesitemos
según lo que nos pida dicha consulta

SELECT columna1, columna2, ... FROM tabla WHERE


condiciones;

Abrimos el cursor, lo que permite acceder a los resultados de la consulta


definida en el paso anterior. Una vez abierto, puedes empezar a recuperar
las filas.

OPEN nombre_cursor;
________________________________________________________________________________
Gestión II/2024 Carrera de Informática - UMSA

FETCH NEXT FROM ejemplo1: Recupera la siguiente fila del conjunto de


resultados del cursor. Ya sean como ejemplo @variable1,@variable2 , etc

FETCH NEXT FROM nombre_cursor INTO @variable1,


@variable2, ...;

Bucle para procesar filas

WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM nombre_cursor INTO @variable1,
@variable2, ...;
END;

Y finalmente cerramos el cursor

CLOSE nombre_cursor;

Y con el reallocate liberamos los recursos del sistema asociados con el


cursor

DEALLOCATE nombre_cursor;

3. 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
________________________________________________________________________________
Gestión II/2024 Carrera de Informática - UMSA

-- 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
________________________________________________________________________________
Gestión II/2024 Carrera de Informática - UMSA

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

-- 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
________________________________________________________________________________
Gestión II/2024 Carrera de Informática - UMSA

• Cuadro comparativo entre ambos gestores:

Característica Oracle SQL Server

Uso de DECLARE
Declaración del Uso del bloque PL/SQL con
nombre_cursor CURSOR
Cursor la palabra clave CURSOR
FOR SELECT...

Apertura del Cursor OPEN nombre_cursor; OPEN nombre_cursor;

FETCH NEXT FROM


Recuperación de FETCH nombre_cursor
nombre_cursor INTO
filas INTO variable1, variable2;
@variable1, @variable2;

Bucle para recorrer LOOP ... EXIT WHEN WHILE @@FETCH_STATUS =


filas %NOTFOUND; 0

Cierre del Cursor CLOSE nombre_cursor; CLOSE nombre_cursor;

Uso de DEALLOCATE
Liberación del No existe el comando
nombre_cursor; para liberar
Cursor DEALLOCATE explícito
memoria

Tipo de bloque Bloque PL/SQL Bloque T-SQL

Manejo de Uso de bloques Se manejan excepciones con


excepciones EXCEPTION TRY...CATCH

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.

4. 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),
________________________________________________________________________________
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

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

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),
________________________________________________________________________________
Gestión II/2024 Carrera de Informática - UMSA

@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
________________________________________________________________________________
Gestión II/2024 Carrera de Informática - UMSA

Where p.id_producto = s.id_producto AND s.id_proveedor =


po.id_proveedor;
-- 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
________________________________________________________________________________
Gestión II/2024 Carrera de Informática - UMSA

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


________________________________________________________________________________
Gestión II/2024 Carrera de Informática - UMSA

CLOSE Cliente_Cursor;
DEALLOCATE Cliente_Cursor;

o Ejecución:

También podría gustarte