Está en la página 1de 4

create table Video(

nro int identity primary key,


titulo varchar(30) not null,
duracion int
)

create table Socio(


ci int primary key,
nombre varchar(30) not null,
edad int
)

create table Prestamo(


nro int references Video,
ci int references Socio,
fecha datetime,
monto decimal(10,2),
obs varchar(6) check(obs in('Dev','No Dev')),
primary key(nro, ci, fecha)
)

insert into Video(titulo, duracion) values('Despertares',4)


insert into Video(titulo, duracion) values('Saw',5)
insert into Video(titulo, duracion) values('Gladiador',10)

select * from Video

insert into Socio values(1,'Carlos',19)


insert into Socio values(2,'Luis',25)
insert into Socio values(3,'Maria',20)
select * from Socio

insert into Prestamo values(1,1,'03/03/08',3,'No Dev')


insert into Prestamo values(2,2,'03/03/08',3,'No Dev')
insert into Prestamo values(3,2,'07/07/08',3,'No Dev')

select * from Prestamo

a. Mediante cursores. Si el prestamo fue el dia D del mes M y anyo A incrementar


el monto en un 5%

create procedure incrementaMonto @D int, @M int, @A int


as
declare
@dia int, @mes int, @anyo int,
@fec datetime,
@mnt decimal(10,2)
declare cur cursor for select fecha, monto from Prestamo
open cur
fetch cur into @fec, @mnt
while(@@FETCH_STATUS=0) begin
set @dia=datepart(day, @fec)
set @mes=datepart(month, @fec)
set @anyo=datepart(year, @fec)
if(@dia=@D and @mes=@M and @anyo=@A)
update Prestamo set monto=monto+monto*0.05 where fecha=@fec
fetch cur into @fec, @mnt
end
close cur
deallocate cur
go

execute incrementaMonto 7,7,2008


select * from Prestamo
b. Mediante procedimiento almacenado, mostrar los nombres de videos que se
presto el socio S y la suma de monto que debe.

create procedure videosPrestados @S varchar(30)


as
declare
@prestados varchar(100),
@suma_monto decimal(10,2),
@tit varchar(30)
declare cur cursor for select v.titulo from Video v, Socio soc, Prestamo p where
v.nro=p.nro and soc.ci=p.ci and soc.nombre=@S and p.obs='No Dev'
set @prestados=' '
open cur
fetch cur into @tit
while(@@FETCH_STATUS=0) begin
set @prestados=@prestados+@tit+', '
fetch cur into @tit
end
close cur
deallocate cur
select @suma_monto=sum(p.monto) from Video v, Socio soc, Prestamo p where
v.nro=p.nro and soc.ci=p.ci and soc.nombre=@S and p.obs='No Dev'
print 'Videos Prestados: {'+@prestados+'} Monto: '+cast(@suma_monto as varchar)
go

execute videosPrestados 'Luis'

c. Mediante triggers impedir la adicion de un nuevo prestamo con Nro. repetido.

create trigger restricNroPrestamo on Prestamo


for insert
as
declare @num int
select @num=nro from inserted
if(exists(select * from prestamo where nro=@num)) begin
raiserror('nro repetido',10,2)
rollback transaction
end
go

insert into Prestamo values(3,1,'07/08/08',3,'No Dev')

d. Regla para permitir solo socios mayores a 18 anyos

create rule reglaSocio


as
@edad>=18

exec sp_bindrule reglaSocio, 'Socio.edad'

insert into Socio values(4,'Pepito',12)

e. Crear una vista para mostrar los nombres de socios y la cantidad de videos que
se presto (Dev o No Dev).

create view nroVideosSocios(socio, monto)


as
select s.nombre, count(p.monto) from Socio s, Prestamo p where s.ci=p.ci group by
s.nombre

select * from nroVideosSocios;

También podría gustarte