Table of Contents
Procedimiento PobtenerNombre_clienteYTituloLibro() en MySQL
En esta ocasión aprenderás cómo crear un procedimiento almacenado en MySQL que permite obtener el nombre de un cliente y el título de un libro, utilizando parámetros de entrada y salida.
Este procedimiento trabaja con dos tablas (prestamos y libros) y se apoya en un INNER JOIN para relacionarlas.
Paso 1: Usar la base de datos
USE bd_biblioteca;
Paso 2: Consultar las tablas
Siempre es recomendable verificar los datos antes de crear un procedimiento:
SELECT * FROM autores;
SELECT * FROM categorias;
SELECT * FROM libros;
SELECT * FROM prestamos;
Paso 3: Crear la consulta base
Primero probamos la consulta que más tarde usaremos en el procedimiento:
SELECT p.nombre_cliente, l.titulo
FROM prestamos AS p
INNER JOIN libros AS l ON p.libro_id = l.Id
WHERE p.id = 4;
Paso 4: Crear el procedimiento almacenado
Si existe, lo eliminamos y luego lo creamos con IN (entrada) y OUT (salida):
DROP PROCEDURE IF EXISTS PobtenerNombre_clienteYTituloLibro;
DELIMITER //
CREATE PROCEDURE PobtenerNombre_clienteYTituloLibro(
IN pId INT, -- Parámetro de entrada: id de la tabla prestamos
OUT pnombre_cliente VARCHAR(50), -- Parámetro de salida: nombre del cliente
OUT ptitulo VARCHAR(50) -- Parámetro de salida: título del libro
)
BEGIN
-- Handler para manejar errores y hacer rollback si ocurre un fallo
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
SELECT 'ERROR DE CONSULTA';
ROLLBACK;
END;
/* Hacemos INNER JOIN entre prestamos y libros
usando la clave ajena p.libro_id = l.id */
SELECT p.nombre_cliente, l.titulo
INTO pnombre_cliente, ptitulo
FROM prestamos AS p
INNER JOIN libros AS l ON p.libro_id = l.Id
WHERE p.Id = pId;
END //
DELIMITER ;
Paso 5: Usar el procedimiento
Creamos variables para guardar los resultados y llamamos al procedimiento:
SET @vpId = 1; -- id del préstamo
SET @vpnombre_cliente = ''; -- variable para el nombre
SET @vptitulo = ''; -- variable para el título
CALL PobtenerNombre_clienteYTituloLibro(@vpId, @vpnombre_cliente, @vptitulo);
-- Mostrar el resultado
SELECT @vpnombre_cliente AS 'Nombre del cliente',
@vptitulo AS 'Título del libro';
Resultado esperado
| Nombre del cliente | Título del libro |
|---|---|
| Juan Pérez | Programación SQL |

⚠️ Error común:
Si no usas INTO dentro de la consulta, los valores de salida quedarán en NULL.



Procedimiento mejorado: devolver una tabla completa
USE bd_biblioteca;
-- Eliminamos el procedimiento si ya existe
DROP PROCEDURE IF EXISTS PobtenerPrestamosConClienteYLibro;
DELIMITER //
CREATE PROCEDURE PobtenerPrestamosConClienteYLibro(
IN pId INT -- Parámetro opcional: si se pasa, filtra por ese id
)
BEGIN
-- Handler para capturar errores
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
SELECT 'ERROR DE CONSULTA';
ROLLBACK;
END;
-- Si el parámetro es mayor a 0, filtramos por ese préstamo
IF pId > 0 THEN
SELECT p.id AS id_prestamo,
p.nombre_cliente,
l.titulo AS titulo_libro,
p.fecha_prestamo,
p.fecha_devolucion
FROM prestamos AS p
INNER JOIN libros AS l ON p.libro_id = l.Id
WHERE p.Id = pId;
ELSE
-- Si el parámetro es 0, mostramos todos los préstamos
SELECT p.id AS id_prestamo,
p.nombre_cliente,
l.titulo AS titulo_libro,
p.fecha_prestamo,
p.fecha_devolucion
FROM prestamos AS p
INNER JOIN libros AS l ON p.libro_id = l.Id;
END IF;
END //
DELIMITER ;
Cómo usar el procedimiento
👉 Ver todos los préstamos con cliente y libro
CALL PobtenerPrestamosConClienteYLibro(0);
👉 Ver solo un préstamo en particular (ejemplo: id=3)
CALL PobtenerPrestamosConClienteYLibro(3);
Resultado esperado
Ejemplo si ejecutamos CALL PobtenerPrestamosConClienteYLibro(0);
| id_prestamo | nombre_cliente | titulo_libro | fecha_prestamo | fecha_devolucion |
|---|---|---|---|---|
| 1 | Laura Gómez | Introducción a SQL | 2024-01-15 | 2024-01-22 |
| 2 | Pedro Sánchez | Bases de Datos Pro | 2024-01-18 | NULL |
| 3 | Juan Pérez | MySQL Avanzado | 2024-02-01 | 2024-02-15 |
Diferencia con la primera versión
Procedimiento con OUT | Procedimiento mejorado |
|---|---|
| Solo devuelve un registro usando variables de salida. | Devuelve un conjunto de resultados (tabla completa). |
| Necesitas definir variables para guardar el resultado. | Basta con ejecutar CALL y obtienes todos los datos directamente. |
| Ideal para casos puntuales (un cliente / un libro). | Ideal para reportes o consultas masivas. |
Preguntas frecuentes (FAQ) sobre procedimientos con parámetros IN y OUT
¿Qué diferencia hay entre IN, OUT e INOUT en MySQL?
- IN: recibe un valor como entrada.
- OUT: devuelve un valor de salida.
- INOUT: sirve tanto para recibir como para devolver valores.
¿Por qué se usa INTO en la consulta del procedimiento?
Porque necesitamos almacenar los resultados en variables de salida (OUT). Sin INTO, la consulta devuelve NULL.
¿Se pueden devolver varios resultados en un procedimiento almacenado?
Sí, puedes usar varios parámetros OUT como en este ejemplo o devolver un conjunto de registros con SELECT.
¿Qué pasa si el id no existe en la tabla prestamos?
El procedimiento devolverá valores NULL en las variables de salida.
Con este procedimiento, ahora puedes obtener fácilmente el nombre de un cliente y el título de un libro en MySQL a partir de un préstamo.
Te puede interesar:
Procedimientos almacenados en MySQL: Ejemplos, cursores y casos prácticos
Entradas recomendadas:






