¡Haz clic para puntuar esta entrada!
(Votos: 1 Promedio: 5)
Procedimiento PobtenerNombre_clienteYTituloLibro() en MySQL
Portada » Procedimiento PobtenerNombre_clienteYTituloLibro() en MySQL

Procedimiento PobtenerNombre_clienteYTituloLibro() en MySQL

Anuncios
Publicidad

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 clienteTítulo del libro
Juan PérezProgramació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_prestamonombre_clientetitulo_librofecha_prestamofecha_devolucion
1Laura GómezIntroducción a SQL2024-01-152024-01-22
2Pedro SánchezBases de Datos Pro2024-01-18NULL
3Juan PérezMySQL Avanzado2024-02-012024-02-15

Diferencia con la primera versión

Procedimiento con OUTProcedimiento 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:

¡Haz clic para puntuar esta entrada!
(Votos: 1 Promedio: 5)

Deja un comentario

¡Haz clic para puntuar esta entrada!
(Votos: 1 Promedio: 5)
error: Content is protected !!
Scroll al inicio
Hablemos de informática
Resumen de privacidad

Esta web utiliza cookies para que podamos ofrecerte la mejor experiencia de usuario posible. La información de las cookies se almacena en tu navegador y realiza funciones tales como reconocerte cuando vuelves a nuestra web o ayudar a nuestro equipo a comprender qué secciones de la web encuentras más interesantes y útiles.