No es un bug, es una característica no documentada

martes, 12 de mayo de 2015

Bases de datos. SQL programado (XVI). Ejercicios (VII)

12:39 Posted by Inazio , No comments
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 comentarios:

Publicar un comentario