Está en la página 1de 5

-- Ejemplo de Final Base de Datos II - Cancela

use jugadores
go
--a )Crea 2 tablas (titulares - suplentes)
-- con un procedimiento, parámetro tabla, debe crear dinámicamente
-- (consultando el catálogo para ver como se compone la clave primaria y además el tipo de
dato).
-- Crear la restricción clave primaria
create procedure pr_crear_tabla
@tabla varchar(128)
as
--variables de soporte
declare @objectId int, @createTableQuery varchar(500), @primaryKeyColumns
varchar(500), @lengthQuery varchar(3)
--obtengo el object id de las tabla jugadores
set @objectId = (select object_id from sys.tables where name = 'jugadores')

-- variables para el cursor


declare @nombre varchar(128), @tipoDato varchar(128),@maxLength varchar(4)

-- cursor para recorrer las columnas de la clave compuesta de jugadores


-- query a todas las columnas del sistema, unidas con los tipos de datos filtradas por
el index para la PK de jugadores
-- es para conseguir el nombre y el tipo de dato y crear la PK de suplentes/titulares
-- results: 1 -> NroDoc, int | 2 -> Tipodoc, char
declare cursor_composicion_clave_primaria cursor for
select c.name, t.name, c.max_length from sys.all_columns c
inner join sys.types t on c.system_type_id = t.system_type_id
where c.object_id = @objectId and c.column_id in (select column_id from
sys.index_columns where object_id = @objectId)

set @createTableQuery = 'CREATE TABLE '+ @tabla+ ' ('


set @primaryKeyColumns = ''

open cursor_composicion_clave_primaria
fetch next from cursor_composicion_clave_primaria into @nombre, @tipoDato,
@maxLength
while @@FETCH_STATUS = 0
begin
set @lengthQuery = ''
if (@tipoDato in('varchar', 'char'))
begin
set @lengthQuery = '('+@maxLength+')'
end
set @createTableQuery = @createTableQuery + @nombre + ' ' + @tipoDato
+ @lengthQuery + ' not null,'
set @primaryKeyColumns = @primaryKeyColumns + @nombre + ','
fetch next from cursor_composicion_clave_primaria into @nombre,
@tipoDato, @maxLength
end
close cursor_composicion_clave_primaria
deallocate cursor_composicion_clave_primaria

-- eliminamos la ultima coma


set @primaryKeyColumns = substring(@primaryKeyColumns,1,
len(@primaryKeyColumns) -1)
set @createTableQuery = @createTableQuery + ' primary key (' +
@primaryKeyColumns + '))'

print @createTableQuery
exec (@createTableQuery)
return 0
go

--b) Inserta 11 jugadores como titulares para cada equipo, restantes como suplentes
-- invocando funcion, con parametros equipo, categoria. Retorna n jugadores mas
viejos (correlacionado)
-- cargar las tablas creadas con una función que busca los jugadores más viejos de
forma correlacionada.

-- funcion (n, equipo, categoria) retorna n jugadores mas viejos Correlacionado


-- cargar las tablas creadas para cada equipo

-- Funcion tipo tabla ya que retorna un listado de los n jugadores mas viejos del club
recibido
create function dbo.fn_jugadores (@n int, @equipo varchar(30), @categoria int)
returns table
as
return (select * from jugadores j where j.id_club = (select id_club from clubes where nombre
= @equipo) and j.categoria = @categoria and
@n > (select count(*) from jugadores j2 where j.fecha_nac > j2.fecha_nac
and j2.id_club = (select id_club from clubes where nombre = @equipo) and j2.categoria =
@categoria))
go
--Procedure para iterar todos los equipos y popular la tabla de titulares con la funcion
anterior
create procedure pr_popular_tablas
as
-- variables de soporte
declare @nombreClub varchar(30), @idClub int
declare clubes cursor
for select id_club, nombre from clubes

open clubes
fetch next from clubes into @idClub, @nombreClub

while(@@FETCH_STATUS = 0)
begin
print 'Insertando jugadores titulares en ambas categorias para el club ' +
@nombreClub
insert into titulares (Tipodoc, nrodoc) select Tipodoc, nrodoc from
dbo.fn_jugadores(11, @nombreClub, 84)
insert into titulares (Tipodoc, nrodoc) select Tipodoc, nrodoc from
dbo.fn_jugadores(11, @nombreClub, 85)
fetch next from clubes into @idClub, @nombreClub
end

close clubes
deallocate clubes

print 'Insertando suplentes'


insert into suplentes (Tipodoc, Nrodoc) select Tipodoc, nrodoc from jugadores j
where not exists
(select * from titulares t where t.Nrodoc = j.Nrodoc and t.Tipodoc = j.Tipodoc)
go

--c) Elimina un titular de cada equipo de la zona 2


-- Trigger que no elimina, lo intercambia con un suplente del mismo club y categoria (si
hay suplentes)
-- saca el titular más viejo y lo intercambia con un suplente
--(mismo club y categoria el cambio de jugadores). Si no hay suplentes no se puede.

create procedure pr_remover_un_titular_por_equipo


as
declare @idClub int, @nombreClub varchar(30)

declare clubes_zona_dos cursor for


select id_club from clubes where nrozona = 2

open clubes_zona_dos
fetch next from clubes_zona_dos into @idClub

while(@@FETCH_STATUS = 0)
begin
set @nombreClub = (select nombre from clubes where id_club = @idClub)
print 'Eliminando un jugador del club '+ @nombreClub
delete top(1) from jugadores where id_club = @idClub
fetch next from clubes_zona_dos into @idClub
end
close clubes_zona_dos
deallocate clubes_zona_dos
go

--Trigger para swapear un titular con un suplente


create trigger tr_jugadores_delete on jugadores instead of delete
as
declare @categoria smallint, @clubId smallint, @nombreClub varchar(30), @rowsAffected
smallint

set @rowsAffected = (select count(*) from deleted)


if (@rowsAffected > 1)
begin
print 'No se contempla la eliminacion de mas de un jugador a la vez'
rollback transaction
end

set @categoria = (select categoria from deleted)


set @clubId = (select id_club from deleted)
set @nombreClub = (select nombre from clubes where id_club = @clubId)

if not exists(select * from suplentes s inner join jugadores j on s.nrodoc = j.nrodoc and
s.tipodoc = j.tipodoc where j.id_club = @clubId and j.categoria = @categoria)
begin
print 'No hay suplentes para el club y la categoria seleccionada'
rollback transaction
end

--usamos la funcion del punto 2 para buscar el jugador mas viejo del club
declare @nroDocTitular int, @tipoDocTitular char(3), @nroDocSuplente int,
@tipoDocSuplente char(3)
set @nroDocTitular = (select top(1) nroDoc from dbo.fn_jugadores(1, @nombreClub,
@categoria))
set @tipoDocTitular = (select top(1) tipoDoc from dbo.fn_jugadores(1, @nombreClub,
@categoria))
set @nroDocSuplente = (select top(1) s.nrodoc from suplentes s inner join jugadores j on
s.nrodoc = j.nrodoc and s.tipodoc = j.tipodoc where j.id_club = @clubId and j.categoria =
@categoria)
set @tipoDocSuplente = (select top(1) s.Tipodoc from suplentes s inner join jugadores j on
s.nrodoc = j.nrodoc and s.tipodoc = j.tipodoc where j.id_club = @clubId and j.categoria =
@categoria)
print 'Titular mas viejo que pasa a suplentes ' + @tipoDocTitular + ' ' + convert(varchar(12),
@nroDocTitular) + ' categoria ' + convert(varchar(2),@categoria)
print 'Suplente que pasa a titulares ' + @tipoDocSuplente + ' ' + convert(varchar(12),
@nroDocSuplente) + ' categoria ' + convert(varchar(2),@categoria)

delete from titulares where nroDoc = @nroDocTitular and @tipoDocTitular = tipoDoc


insert into titulares (Tipodoc, nrodoc) values(@tipoDocSuplente, @nroDocSuplente)
delete from suplentes where tipodoc = @tipoDocSuplente and nrodoc = @nroDocSuplente
insert into suplentes (Tipodoc, nrodoc) values (@tipoDocTitular, @nroDocTitular)

go

--d) listar jugadores titulares de cada equipo de la zona 2

--select j.tipodoc, j.nrodoc, j.nombre, j.fecha_nac, j.categoria, c.nombre from jugadores j


inner join titulares t on j.tipodoc = t.tipodoc and j.nrodoc = t.nrodoc inner join clubes c on
j.id_club = c.id_club and c.nrozona = 2 order by c.id_club,j.categoria

--e) deshace el punto c


-- confirma la transacción

--Transaccion principal que ejecuta los procedimientos creados


begin transaction modelo_final
exec pr_crear_tabla 'suplentes'
exec pr_crear_tabla 'titulares'
exec pr_popular_tablas
save transaction tablas_listas
exec pr_remover_un_titular_por_equipo
select j.tipodoc, j.nrodoc, j.nombre, j.fecha_nac, j.categoria, c.nombre from jugadores j inner
join titulares t on j.tipodoc = t.tipodoc and j.nrodoc = t.nrodoc inner join clubes c on j.id_club
= c.id_club and c.nrozona = 2 order by c.id_club,j.categoria

rollback transaction tablas_listas


commit transaction modelo_final

--Drops
drop procedure pr_crear_tabla
drop procedure pr_popular_tablas
drop procedure pr_remover_un_titular_por_equipo
drop trigger tr_jugadores_delete
drop function fn_jugadores
drop table suplentes
drop table titulares

También podría gustarte