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.

Solución 1 (con cursor):

delimiter $$

drop function if exists pregunta1 $$

create function pregunta1()
returns double
reads sql data
begin
     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;
     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 ;

Solución 2 (con subconsultas):

delimiter $$

drop function if exists pregunta1 $$

create function pregunta1()
returns double
reads sql data
begin
     declare totalPueblos int;
     declare pueblosRequisito int;
     declare porcentaje double;
     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) y los inserte en la tabla municipio. Usa transacciones. El id será una unidad más que el mayor existente. Retorna -1 si la comunidad no existe, -2 si algún valor es nulo, -3 ante error, 1 si correcto.

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(curdate()) = 7 then
         signal sqlstate '20000';
     end if;
end $$

delimiter ;