Para practicar previa realización del examen, vamos a realizar el del tercer trimestre del año pasado.
Para ello hay que cargar el .sql eval3, que puedes descargar desde aquí
Pregunta
1 (3 puntos)
Realiza
una función de nombre pregunta1 que devuelva el porcentaje de municipios cuya
población no ha disminuido a lo largo de los años que figuran en la tabla
municipios.
-- SOLUCION 1
delimiter $$
drop function if exists pregunta1 $$
create function pregunta1()
returns double
reads sql data
begin
-- Declaraciones
declare ultimaFila int default
0;
declare v2003 int;
declare v2001 int;
declare v1996 int;
declare v1991 int;
declare totalPueblos int default 0;
declare pueblosRequisito int default 0;
declare porcentaje double;
declare pueblos cursor for
select poblacion2003, poblacion2001,
poblacion1996, poblacion1991
from municipio;
declare
continue handler for not found
set ultimaFila = 1;
-- Operaciones
open pueblos;
verPueblos: loop
fetch pueblos into v2003, v2001,
v1996, v1991;
if ultimaFila = 1 then
leave verPueblos;
end if;
set totalPueblos =
totalPueblos + 1;
if v1996 >= v1991
and v2001 >= v1996 and v2003 >= v2001 then
set
pueblosRequisito = pueblosRequisito + 1;
end if;
end loop verPueblos;
close pueblos;
set porcentaje = (pueblosRequisito * 100) /
totalPueblos;
return porcentaje;
end $$
delimiter ;
-- SOLUCION 2
delimiter $$
drop function if exists pregunta1 $$
create function pregunta1()
returns double
reads sql data
begin
-- Declaraciones
declare totalPueblos int;
declare pueblosRequisito int;
declare porcentaje double;
-- Operaciones
set totalPueblos = (select
count(*) from municipio);
set pueblosRequisito = (select
count(*) from municipio where poblacion1996 >= poblacion1991 and
poblacion2001 >= poblacion1996 and poblacion2003 >= poblacion2001);
set porcentaje = (pueblosRequisito * 100) /
totalPueblos;
return porcentaje;
end $$
delimiter ;
Pregunta
2 (3,75 puntos)
Realiza un procedimiento que reciba los datos de un
municipio (excepto el identificador de municipio) y los inserte en la tabla
municipio. Usa transacciones. Utilizar una variable OUT para indicar el
resultado de la ejecución del procedimiento. Aspectos a tener en cuenta:
- El identificador de municipio será una unidad más que el
mayor existente en la tabla municipio.
- Si la comunidad que se le pasa como argumento no existe
entonces el procedimiento no realizará la inserción y devolverá -1 en el
parámetro OUT.
- Si alguno de los valores pasado es nulo entonces el
procedimiento tampoco realizará la inserción y devolverá -2 en el parámetro
OUT.
- Ante cualquier situación de error provocada en el intento
de hacer la inserción, el procedimiento deshará la operación y devolverá -3 en
su parámetro OUT.
- Si la inserción se realiza correctamente, se validará la
misma y se devolverá un 1 en la variable OUT.
delimiter $$
drop procedure if exists pregunta2 $$
create procedure pregunta2(vNombre varchar(70), v2003 int, v2001 int,
v1996 int, v1991 int, vSuperficie int, cAutonoma int, out resultado int)
modifies sql data
begin
declare id int;
declare exit handler for
sqlexception
begin
set resultado = -3;
rollback;
end;
start transaction;
if vNombre is null or v2003 is
Null or v2001 is null or v1996 is null or v1991 is null or vSuperficie is null
or cAutonoma is null then
set resultado = -2;
rollback;
elseif cAutonoma not in(select
ca_id from comunidad) then
set resultado = -1;
rollback;
else
set id = (select m_id from
municipio order by m_id desc limit 1) + 1;
insert into
municipio values(id, vNombre, v2003, v2001, v1996, v1991, vSuperficie,
cAutonoma);
set resultado = 1;
commit;
end if;
end $$
delimiter ;
Pregunta
3 (3,25 puntos)
Realiza un trigger que no permita realizar modificaciones en
la tabla municipio los fines de semana (sábados o domingos).
delimiter
$$
drop
trigger if exists problema3 $$
create
trigger problema3
before update on municipio
for each row
begin
if dayofweek(curdate()) = 1 or dayofweek =
7 then
signal sqlstate '20000';
end if;
end $$
delimiter
;
0 comments:
Publicar un comentario