Procedimientos Almacenados en SQL: Ejercicios Prácticos con Soluciones
Enviado por Chuletator online y clasificado en Francés
Escrito el en español con un tamaño de 6,16 KB
En este documento, se presentan varios ejercicios resueltos sobre procedimientos almacenados en SQL, utilizando una base de datos de ejemplo llamada "Librería". Cada ejercicio incluye el código SQL completo y una breve explicación.
Ejercicio 1: Mostrar Libros por Autor
Enunciado: Crear un procedimiento que reciba el nombre de un autor como parámetro y muestre todos los libros de ese autor.
USE Librería;
GO
CREATE PROCEDURE libros_autor
@autor VARCHAR(50)
AS
SELECT * FROM Libros
WHERE Autor = @autor;
GO
EXEC libros_autor 'Reverte';
Ejercicio 2: Mostrar Libros por Autor y Editorial
Enunciado: Crear un procedimiento que reciba el nombre de un autor y el nombre de una editorial como parámetros, y muestre todos los libros de ese autor y editorial.
USE Librería;
GO
CREATE PROCEDURE libros_autor_editorial
@autor VARCHAR(50),
@edit SMALLINT
AS
SELECT * FROM Libros
WHERE Autor = @autor AND Editorial = @edit;
GO
EXEC libros_autor_editorial 'Reverte', 'Alfaguara';
Nota: El código original tenía un error. Se asume que la editorial se pasa como un ID numérico (SMALLINT
), no como el nombre de la editorial (VARCHAR
). Si la editorial se debe buscar por nombre, el tipo de dato del parámetro @edit
debería ser VARCHAR
y la consulta debería ajustarse para buscar por el nombre de la editorial en la tabla correspondiente (si existe una tabla de editoriales separada).
Ejercicio 3: Calcular el Promedio de Dos Números
Enunciado: Crear un procedimiento almacenado que reciba dos números y devuelva su promedio.
CREATE PROCEDURE promedio
@num1 INT,
@num2 INT,
@media INT OUTPUT
AS
SELECT @media = (@num1 + @num2) / 2;
GO
DECLARE @resultado INT;
EXEC promedio 5, 6, @resultado OUTPUT;
SELECT @resultado;
Ejercicio 4: Información de Libros por Autor y Cálculo de Precios
Enunciado: Crear un procedimiento almacenado que muestre los títulos, editorial y precio de los libros de un determinado autor (enviado como parámetro de entrada). El procedimiento también debe devolver la suma y el promedio de los precios de todos los libros del autor.
USE Librería;
GO
CREATE PROCEDURE precio_libros
@autor VARCHAR(50),
@sum MONEY OUTPUT,
@media MONEY OUTPUT
AS
SELECT Titulo, Editorial, Precio FROM Libros WHERE Autor = @autor;
SELECT @sum = SUM(Precio) FROM Libros WHERE Autor = @autor;
SELECT @media = AVG(Precio) FROM Libros WHERE Autor = @autor;
GO
DECLARE @suma MONEY;
DECLARE @promedio MONEY;
EXEC precio_libros 'Reverte', @suma OUTPUT, @promedio OUTPUT;
PRINT 'El precio total de los libros es: ' + CAST(@suma AS VARCHAR);
PRINT 'El precio promedio de los libros es: ' + CAST(@promedio AS VARCHAR);
Correcciones:
- Se corrigió la asignación de
@sum
y@media
. Ahora se usaSELECT @sum = ...
ySELECT @media = ...
en lugar de asignaciones separadas. - Se añadió la función
CAST
para convertir@suma
y@promedio
aVARCHAR
para poder concatenarlos con texto en elPRINT
. - Se declaró
@suma
y@promedio
comoMONEY
.
Ejercicio 5: Mostrar Libros por Autor con Validación de Entrada
Enunciado: Crear un procedimiento que muestre todos los libros de un autor determinado. Si no se ingresa un valor para el autor, se muestra un mensaje.
USE Librería;
GO
CREATE PROCEDURE libros_autor2
@autor VARCHAR(50) = NULL
AS
IF @autor IS NULL
BEGIN
SELECT 'Debe indicar un autor';
RETURN;
END;
SELECT titulo FROM libros WHERE autor = @autor;
GO
Ejercicio 6: Insertar Registros en la Tabla "Libros"
Enunciado: Crear un procedimiento almacenado que inserte registros en la tabla "libros". Los parámetros de título y autor son obligatorios, los demás son opcionales. El procedimiento retorna 1 si la inserción se realiza correctamente y 0 si falla (debido a que título o autor son nulos).
USE Librería;
GO
CREATE PROCEDURE libros_ingreso
@titulo VARCHAR(40) = NULL,
@autor VARCHAR(30) = NULL,
@editorial VARCHAR(20) = NULL,
@precio DECIMAL(5, 2) = NULL
AS
IF (@titulo IS NULL) OR (@autor IS NULL)
BEGIN
RETURN 0;
END
ELSE
BEGIN
INSERT INTO libros (titulo, autor, editorial, precio) VALUES (@titulo, @autor, @editorial, @precio);
RETURN 1;
END;
GO
DECLARE @retorno INT;
EXEC @retorno = libros_ingreso 'Alicia en el pais...', 'Lewis Carroll';
SELECT 'Ingreso realizado=1' = @retorno;
EXEC @retorno = libros_ingreso;
SELECT 'Ingreso realizado=1' = @retorno;
Ejercicio Adicional: Cálculo de la Nota Media de una Clase
Enunciado: Calcular la nota media de la clase SIR2, obteniendo el número total de alumnos y la suma de todas las notas. Se asume que existe una tabla llamada "Alumnos" con las columnas "dnialumno" y "nota".
USE Librería; -- Asegúrate de estar en la base de datos correcta
GO
CREATE PROCEDURE notaMedia
@numal SMALLINT OUTPUT,
@sumanota SMALLINT OUTPUT,
@media SMALLINT OUTPUT
AS
SELECT @numal = COUNT(dnialumno) FROM alumnos;
SELECT @sumanota = SUM(nota) FROM alumnos;
SET @media = @sumanota / @numal;
GO
DECLARE @medianota SMALLINT;
EXEC notaMedia @medianota = @medianota OUTPUT;
select @medianota
Correcciones y Mejoras:
- Los parámetros de salida
@numal
y@sumanota
deben ser declarados como OUTPUT en la definición del procedimiento. - Se corrigió la forma de llamar al procedimiento almacenado. Se debe usar
EXEC nombre_procedimiento @parametro = @variable OUTPUT
. - Se utiliza
SET
para asignar el resultado de la división a@media
. - Se ha añadido la selección de la base de datos
USE Librería
para asegurar que se ejecuta en el contexto correcto.