Está en la página 1de 7

Tema 9.- Programación. Cursores Solución Ejercicio: I.E.S.

Número 1 (Gijón)
HOCKEY. Parte 12.Proce_Almac

1. Crear un procedimiento, llamado MediaCompetición, que permita calcular la media de


espectadores que acuden a cada competición.

En el caso de no haberse celebrado partidos en una determinada competición, el


procedimiento deberá pintar los datos que disponga y un literal que indique No se han
celebrado partidos.

La visualización final deberá tener el formato:

Código competición Competición Fecha de Inicio Media de Espectadores

-- ================================================
-- Procedimiento Almacenado para calcular la media
-- de espectadores en cada competición, indicando
-- algunos datos de de la competición.
-- ================================================
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE pa_MediaCompetición

AS
BEGIN
SET NOCOUNT ON;

SELECT con.idComp as [Codigo], con.nombre as [Competición],


con.fecIni as [Fecha de Inicio],
ISNULL(cast(AVG(pa.numEsp) as CHAR(35)),
'No se han disputado partidos') as [Media de Espectadores]
FROM competicion con left join partidos pa
ON con.idComp = pa.idComp
GROUP BY con.idComp, con.nombre, con.fecIni
ORDER BY con.idComp
END

/* Ejemplo de llamada */
-- Seleccionamos la base de datos
use Patinazo

-- Ejecutamos el procedimiento almacenado


EXEC pa_MediaCompetición

José A. Priego Gestión de Base de Datos (ASR) Página 1


Tema 9.- Programación. Cursores Solución Ejercicio: I.E.S. Número 1 (Gijón)
HOCKEY. Parte 12.Proce_Almac

2. Desarrollar el procedimiento NuevoEquipo que permita introducir un nuevo equipo de


hockey. El procedimiento debe contener:
 Conjunto de variables de entrada que permitan introducir los datos.
 Una variable de salida para permitir visualizar los mensajes.
 Una transacción denominada añadir.
 Mensaje de “Introducción realizada satisfactoriamente”, o bien mensaje de “Sentimos
no poder realizar la creación del equipo”.

Un ejemplo podría ser:


NumReg=10, Nombre=’Patintin’, Localidad=’Teruel’, fecCrea=’2012-06-01’
tfnConta=’957111111’, presupuesto=100000, desaparecido=’n’, numFed=999,
ccaa=’ARA’ y ‘CAT’ para 2 ejecuciones diferentes.

-- ================================================
-- Procedimiento Almacenado para insertar equipo
-- en la tabla Equipos.
-- ================================================
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE pa_NuevoEquipo
-- Parámetros de Entrada
@numero INT,
@nombre nvarchar(30),
@localidad NVARCHAR(50),
@alta date,
@tfno nvarchar(9),
@presupuesto int,
@existe nvarchar(1),
@comunidad varchar(3),
@numFed int,
-- Parámetro de Salida
@mensajes nvarchar(150) OUTPUT
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRANSACTION añadir
BEGIN TRY
INSERT INTO Equipos (numReg, nombre, localidad, fecCrea, tfnConta,
presupuesto, desaparecido, ccaa, numFed)
VALUES (@numero, @nombre, @localidad, @alta, @tfno, @presupuesto,
@existe, @comunidad, @numFed)

SET @mensajes='Equipo insertado satisfactoriamente'


COMMIT TRANSACTION añadir
END TRY

BEGIN CATCH
SET @mensajes = 'Se produjo el error: '+ERROR_MESSAGE()+' en la
linea '+CAST(ERROR_LINE() as nvarchar(100))
ROLLBACK TRANSACTION añadir
END CATCH
END

José A. Priego Gestión de Base de Datos (ASR) Página 2


Tema 9.- Programación. Cursores Solución Ejercicio: I.E.S. Número 1 (Gijón)
HOCKEY. Parte 12.Proce_Almac

/* Ejemplos de llamadas */
-- Seleccionamos la base de datos
use Patinazo

-- Ejecutamos la primera opción del procedimiento almacenado


DECLARE @mensajes nvarchar(150)
EXEC pa_NuevoEquipo 10,'Patintin','Teruel','2012-06-01', '957111111', 100000, 'n',
'ARA', 999, @mensajes OUTPUT
SELECT @mensajes AS [Mensaje de ejecucion]

-- Ejecutamos la segunda opción del procedimiento almacenado


DECLARE @mensajes nvarchar(150)
EXEC pa_NuevoEquipo 10,'Patintin','Teruel','2012-06-01', '957111111', 100000, 'n',
'CAT', 999, @mensajes OUTPUT
SELECT @mensajes AS [Mensaje de ejecucion]

José A. Priego Gestión de Base de Datos (ASR) Página 3


Tema 9.- Programación. Cursores Solución Ejercicio: I.E.S. Número 1 (Gijón)
HOCKEY. Parte 12.Proce_Almac

3. Realizar el procedimiento almacenado BonificarJugador. Este procedimiento debe realizar


una actualización del atributo ficha anual, en el jugador más veterano de la federación, si la
bonificación a realizar no es superior a la ficha anual actual.

-- ================================================
-- Procedimiento Almacenado para bonificar al jugador
-- más veterano si la bonificación no excede su ficha anual.
-- ================================================
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE pa_Bonificarjugador
-- Parámetros de Entrada
@bonifica int,
-- Parámetro de Salida
@mensajes nvarchar(150) OUTPUT
AS
BEGIN
DECLARE @numero int, @ficha int
SET NOCOUNT ON;
BEGIN TRANSACTION bonificar
BEGIN TRY
select @numero=numFed, @ficha=isnull(fichAnual,0)
from jugadores
where fecNto= (select MIN(fecNto) from Jugadores)

if (@ficha >= @bonifica)


begin
update Jugadores set
fichAnual=isnull(fichAnual,0)+@bonifica
where numFed=@numero

SET @mensajes='Bonificación realizada satisfact.'


end
else
begin
SET @mensajes='NO es posible realizar la
bonificación. Cantidad elevada para esa ficha'
end

COMMIT TRANSACTION bonificar


END TRY

BEGIN CATCH
SET @mensajes = 'Se produjo el error: '+ERROR_MESSAGE()
ROLLBACK TRANSACTION bonificar
END CATCH
END

/* Ejemplo de llamada */
-- Seleccionamos la base de datos
use Patinazo

-- Ejecutamos la primera opción del procedimiento almacenado


DECLARE @mensajes nvarchar(150)
EXEC pa_BonificarJugador 20000, @mensajes OUTPUT
SELECT @mensajes AS [Mensaje de ejecucion]

José A. Priego Gestión de Base de Datos (ASR) Página 4


Tema 9.- Programación. Cursores Solución Ejercicio: I.E.S. Número 1 (Gijón)
HOCKEY. Parte 12.Proce_Almac

4. Crear un procedimiento, llamado MediaCompeticiónManual, que permita calcular la


media de espectadores que acuden a una determinada competición.

La competición deberá ser introducida durante el proceso de llamada al procedimiento, El


procedimiento controlará, mediante el uso de condicionales, la existencia del código de
competición.

Finalmente se obtiene el ingreso medio de la competición, fuera del procedimiento, sabiendo


que cada espectador paga 12€ en concepto de entrada.

Las visualizaciones finales deberán tener el formato:

Para códigos de competiciones correctas, aunque no hayan disputado partidos:


El número medio de espectadores es: 100
Los ingresos medios son aproximadamente: 1200

Para códigos de competiciones no existentes:


No existe esta competición
Los ingresos medios son aproximadamente: 0

--================================================
--Procedimiento Almacenado para calcular la media
--de espectadores en una determinada competición, indicando
--el ingreso media en función de 12€ por espectador.
--================================================
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE pa_MediaCompeticionManual
@competicion int, @especta int OUTPUT
AS
BEGIN
SET NOCOUNT ON;
if exists(select * from Competicion where idComp=@competicion)
Begin
SET @especta= (SELECT AVG(pa.numEsp) FROM competicion con
INNER JOIN partidos pa ON con.idComp = pa.idComp
and con.idComp=@competicion
GROUP BY con.idComp)
print 'El numero medio de espectadores es: ' +
cast((isnull(@especta,0)) as char)
end
else
Begin
print 'No existe esta competición '
set @especta = 0
end
END

--/* Ejemplo de llamada. Ejecutamos el procedimiento almacenado */


DECLARE @especta int
EXEC pa_MediaCompeticionManual 5, @especta OUTPUT
print 'Los ingresos medios son aproximadamente: ' +
cast((isnull(@especta*12,0)) as char)

José A. Priego Gestión de Base de Datos (ASR) Página 5


Tema 9.- Programación. Cursores Solución Ejercicio: I.E.S. Número 1 (Gijón)
HOCKEY. Parte 12.Proce_Almac

5. Crear los procedimientos:


 MaximoPresupuesto. Calcula el equipo de jockey que maneja el presupuesto más
alto.
 ObtenerJugador. Obtiene los jugadores que pertenecen al equipo que se pasa
como parámetro de entrada.

De acuerdo con el proceso siguiente: Primero se ejecuta el procedimiento del cálculo


del equipo que posee el mayor presupuesto y a continuación y con el valor obtenido, y
desde el propio procedimiento, ejecutar el procedimiento que obtiene todos los
jugadores del equipo.
Las visualizaciones deben tener el formato:
Zona de mensajes:
El máximo presupuesto es del equipo 3
El equipo lo forman 5 jugadores

Zona de resultados:
Select del equipo obtenido
Select de los jugadores del equipo

--================================================
-- Procedimiento Almacenado que obtiene los jugadores
-- del equipo que se pasan como parámetro
--================================================
CREATE PROCEDURE pa_ObtenerJugador
@numero int
AS
BEGIN
DECLARE @cuentas int = (select COUNT(*) from jugadores where numReg=@numero)
SET NOCOUNT ON;
print 'El equipo lo forman: '+ cast(@cuentas as char(2))+ ' jugadores'
select * from jugadores where numReg=@numero
END

--================================================
--Procedimiento Almacenado para obtiene el equipo
--que posee mayor presupuesto.
--Con ese dato se obtienen los jugadores del mismo.
--================================================
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE pa_MaximoPresupuesto AS
BEGIN
DECLARE @equipo int =0
SET NOCOUNT ON;
select * from Equipos
where presupuesto = (select MAX(presupuesto) from equipos)
set @equipo = (select numReg from Equipos
where presupuesto = (select MAX(presupuesto) from equipos))
print 'El máximo presupuesto es del equipo ' + cast(@equipo as char)
EXEC pa_ObtenerJugador @equipo
END

----/* Ejemplo de llamada. Ejecutamos el procedimiento almacenado principal*/


EXEC pa_MaximoPresupuesto

José A. Priego Gestión de Base de Datos (ASR) Página 6


Tema 9.- Programación. Cursores Solución Ejercicio: I.E.S. Número 1 (Gijón)
HOCKEY. Parte 12.Proce_Almac

6. Dados los procedimientos anteriores, ejecutar los procedimientos no produciendo un


anidamiento entre ellos, es decir, se ejecuta primero el procedimiento del cálculo del equipo
y con el valor obtenido se visualizan todos los jugadores del equipo.

Las visualizaciones deben tener el formato:


Zona de mensajes:
El máximo presupuesto es del equipo 3
El equipo lo forman 5 jugadores
Zona de resultados:
Select del equipo obtenido
Select de los jugadores del equipo

--================================================
-- Procedimiento Almacenado que obtiene los jugadores
-- del equipo que se pasan como parámetro
--================================================
CREATE PROCEDURE pa_ObtenerJugador
@numero int
AS
BEGIN
DECLARE @cuentas int = (select COUNT(*) from jugadores where numReg=@numero)
SET NOCOUNT ON;
print 'El equipo lo forman: '+ cast(@cuentas as char(2))+ ' jugadores'
select * from jugadores where numReg=@numero
END

--================================================
--Procedimiento Almacenado para obtiene el equipo
--que posee mayor presupuesto.
--Con ese dato se obtienen los jugadores del mismo.
--================================================
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE pa_MaximoPresupuestoV2
@equipo int OUTPUT
AS
BEGIN
SET @equipo=0

SET NOCOUNT ON;


select * from Equipos
where presupuesto = (select MAX(presupuesto) from equipos)
set @equipo = (select numReg from Equipos
where presupuesto = (select MAX(presupuesto) from equipos))
print 'El máximo presupuesto es del equipo ' + cast(@equipo as char)
END

----/* Ejemplo de llamada. Ejecutamos el procedimiento almacenado principal*/


DECLARE @equipo int
EXEC pa_MaximoPresupuestoV2 @equipo OUTPUT
EXEC pa_ObtenerJugador @equipo

José A. Priego Gestión de Base de Datos (ASR) Página 7

También podría gustarte