Table of Contents
Cómo usar cursores en MySQL paso a paso con ejemplos prácticos
En este ejemplo práctico aprenderemos a usar cursores en MySQL mediante un procedimiento almacenado llamado recorrerNombre.
El objetivo será recorrer la columna nombre de la tabla clientes, dentro de la base de datos tiendaonline, utilizando un cursor y el comando FETCH.
¿Qué es un cursor en MySQL?
Un cursor en SQL es un mecanismo que permite recorrer fila por fila el resultado de una consulta.
A diferencia de una sentencia SELECT normal (que devuelve un conjunto de resultados completo), un cursor nos permite procesar cada fila individualmente dentro de un bucle.
Se utiliza mucho en:
✅ Procesamiento iterativo de registros.
✅ Ejecución de operaciones fila a fila.
✅ Escenarios donde no basta con una sola consulta SELECT.
Flujo del procedimiento
Durante cada iteración del bucle:
FETCHrecupera un valor (el nombre de un cliente) desde el cursor y lo guarda en la variablev_nombre.- Si ya no hay más filas, se activa el manejador
CONTINUE HANDLER FOR NOT FOUND, que cambia el valor de la variablev_semaforoaTRUE.- Esto provoca la salida del bucle (
LEAVE).
- Esto provoca la salida del bucle (
- Si se recuperó un nombre correctamente, se imprime con:
SELECT v_nombre AS nombre;
Paso 1: Usar la base de datos
USE tiendaonline;

Paso 2: Comprobar la tabla clientes
SELECT * FROM tiendaonline.clientes;
Paso 3: Borrar el procedimiento si existe
DROP PROCEDURE IF EXISTS recorrerNombre;
Paso 4: Crear el procedimiento con un cursor
DELIMITER //
CREATE PROCEDURE recorrerNombre()
BEGIN
-- Variable que permite salir del bucle cuando no quedan más filas
DECLARE v_semaforo BOOLEAN DEFAULT 0;
DECLARE v_nombre VARCHAR(50);
-- Declaración del cursor para recorrer los nombres de clientes
DECLARE cNombreCursor CURSOR FOR
SELECT c.nombre FROM tiendaonline.clientes AS c;
-- Manejador: cuando no haya más filas, cambiamos el semáforo
DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_semaforo = 1;
-- Abrimos el cursor
OPEN cNombreCursor;
-- Bucle para recorrer los resultados
recorrer: LOOP
FETCH cNombreCursor INTO v_nombre;
-- Salimos si no hay más registros
IF v_semaforo THEN
LEAVE recorrer;
END IF;
-- Mostramos el nombre recuperado
SELECT v_nombre AS nombre;
END LOOP;
-- Cerramos el cursor
CLOSE cNombreCursor;
END //
DELIMITER ;
Paso 5: Ejecutar el procedimiento
CALL recorrerNombre();
El resultado será una lista de nombres de clientes, uno por cada iteración.



Conclusión
Con este ejemplo hemos aprendido a:
- Declarar y abrir un cursor en MySQL.
- Usar FETCH para recuperar registros uno a uno.
- Controlar la salida del bucle con un handler (
NOT FOUND). - Mostrar los resultados fila por fila.
Este enfoque es muy útil en procesos donde se requiere recorrer registros de forma controlada, como en migraciones, transformaciones de datos o auditorías personalizadas.



Preguntas frecuentes (FAQ)
1. ¿Cuándo debo usar cursores en MySQL?
Los cursores son útiles cuando necesitas procesar registros de forma iterativa. Sin embargo, en la mayoría de los casos es más eficiente usar consultas con JOIN, GROUP BY o subconsultas.
2. ¿Qué pasa si no cierro un cursor?
Si no se cierra, el cursor permanece abierto y puede causar problemas de rendimiento o errores al intentar abrir nuevos cursores.
3. ¿Puedo usar varios cursores dentro de un mismo procedimiento?
Sí, puedes declarar varios cursores, siempre que gestiones cada uno correctamente con OPEN, FETCH y CLOSE.
4. ¿Qué diferencia hay entre un cursor y un bucle WHILE en MySQL?
- Un cursor recorre el resultado de una consulta fila por fila.
- Un bucle WHILE puede usarse para iteraciones controladas por condiciones, pero sin conexión directa con el resultado de una consulta.
5. ¿Qué alternativa más eficiente hay al uso de cursores?
En muchos casos, una sola consulta SQL bien estructurada (con JOIN, WHERE, HAVING, etc.) es más rápida que usar cursores. Los cursores son recomendables solo cuando no existe una solución set-based directa.
Te puede interesar:
Procedimientos almacenados en MySQL: Ejemplos, cursores y casos prácticos
Seguir leyendo:






