Cómo crear un USB booteable de Linux Mint 20.1 paso a paso
En este tutorial aprenderás paso a paso cómo crear un procedimiento almacenado con cursor en MySQL para recorrer registros de un usuario específico dentro de una base de datos.
Trabajaremos con una base de datos llamada tiendaonline y mostraremos cómo verificar si un cliente con determinado id_cliente coincide con el nombre “Luis Pérez”.
Este ejercicio es perfecto para comprender cómo funcionan los cursores, los manejadores de errores y los bucles (LOOP) en MySQL.
Queremos recorrer un registro dentro de la tabla clientes para comprobar si el nombre de un usuario con un ID concreto coincide con “Luis Pérez”.
Si coincide, el procedimiento devolverá un mensaje confirmando que el usuario existe; de lo contrario, mostrará que no coincide.
Antes de comenzar, selecciona la base de datos con la que vas a trabajar:
USE tiendaonline;
Puedes verificar que el cliente con id_cliente = 2 existe y conocer su nombre:
SELECT c.nombre FROM clientes AS c WHERE id_cliente = 2;
Esto evita conflictos al volver a crearlo:
DROP PROCEDURE IF EXISTS recorrerElUsuario;
Es necesario cambiar el delimitador (; → //) para poder definir correctamente el cuerpo del procedimiento:
DELIMITER //
Definimos el procedimiento recorrerElUsuario, que recibe como parámetro de entrada el ID del cliente.
CREATE PROCEDURE recorrerElUsuario(IN p_Id INT)
BEGIN
DECLARE variableNombre VARCHAR(30);
DECLARE semaforo INT DEFAULT 0;
DECLARE cursorNombre CURSOR FOR
SELECT c.nombre FROM clientes AS c WHERE id_cliente = p_Id;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET semaforo = 1;
OPEN cursorNombre;
miBucle: LOOP
FETCH cursorNombre INTO variableNombre;
IF semaforo = 1 THEN
LEAVE miBucle;
END IF;
IF variableNombre = 'Luis Pérez' THEN
SELECT CONCAT('✅ El usuario existe en la base de datos: ', variableNombre) AS resultado;
LEAVE miBucle;
ELSE
SELECT CONCAT('❌ El usuario no coincide en la base de datos: ', variableNombre) AS resultado;
END IF;
END LOOP;
CLOSE cursorNombre;
END //
DELIMITER ;
Una vez creado, puedes ejecutarlo así:
CALL recorrerElUsuario(2);
DECLARE variableNombre: almacena el nombre obtenido desde el cursor.
DECLARE semaforo: actúa como bandera para detectar el final de los registros.
DECLARE cursorNombre CURSOR FOR ...: define el cursor que selecciona el nombre del cliente según el ID indicado.
CONTINUE HANDLER FOR NOT FOUND: se activa automáticamente cuando ya no hay filas que recorrer.
OPEN cursorNombre: abre el cursor.
FETCH ... INTO variableNombre: recupera cada fila y la almacena en la variable.
IF variableNombre = 'Luis Pérez': compara el nombre con el valor buscado y devuelve un mensaje.
LEAVE miBucle: sale del bucle una vez encontrada la coincidencia o cuando no quedan más registros.
CLOSE cursorNombre: cierra el cursor para liberar recursos.
Si el cliente con id_cliente = 2 se llama Luis Pérez, MySQL devolverá:
✅ El usuario existe en la base de datos: Luis Pérez
Si no coincide:
❌ El usuario no coincide en la base de datos: [nombre encontrado]
Usa cursores solo cuando sea necesario, ya que suelen consumir más recursos que las consultas directas.
Siempre cierra los cursores al final del procedimiento.
Si necesitas recorrer múltiples registros, puedes incluir más lógica dentro del bucle LOOP.
Cambia el delimitador (DELIMITER //) solo dentro del bloque de definición, y restáuralo después.
| procedimiento almacenado con un cursor para recorrer un usuario en MySQL |
¿Qué es un cursor en MySQL?
Un cursor es un puntero que permite recorrer los resultados de una consulta fila por fila. Es útil cuando necesitas procesar registros de forma secuencial dentro de un procedimiento almacenado.
¿Cuándo se recomienda usar cursores?
Cuando el procesamiento requiere lógica por cada registro (validaciones, cálculos, comparaciones, etc.) que no se puede resolver con una sola sentencia SQL.
¿Qué hace el manejador CONTINUE HANDLER FOR NOT FOUND?
Indica al procedimiento qué hacer cuando no hay más registros que procesar. En este caso, activa la variable semaforo para salir del bucle.
¿Qué ocurre si el procedimiento no encuentra ningún registro?
El cursor no recupera datos, el manejador se activa y el bucle finaliza sin mostrar coincidencias.
¿Puedo recorrer más de un registro a la vez?
Sí. Simplemente cambia la consulta del cursor (SELECT ...) para devolver varios resultados y ajusta el código dentro del LOOP según tus necesidades.
Comentarios
Publicar un comentario