You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Fase 4: Explotación de la Base de Datos mediante PL/SQL
Tarea 1.
Escribe una función que reciba un nombre de producto, un código de campo de refugiados y dos fechas y devuelva el número de unidades de ese producto que se ha recibido en dicho campo entre las dos fechas.
CREATE OR REPLACEFUNCTIONSaberUnidadesTotales(p_NombreProducto productos.nombre%TYPE,
p_CodCampoRefugiado campos_refugiados.codigo%TYPE,
p_FechaInicio envios.fecha_hora%TYPE,
p_FechaFin envios.fecha_hora%TYPE)
returns NUMERICAS $$
DECLARE
v_CantidadTotal NUMERIC :=0;
BEGIN
PERFORM ComprobarExcepciones(p_NombreProducto, p_CodCampoRefugiado, p_FechaInicio, p_FechaFin);
v_CantidadTotal:=SaberCodigoEnviosValidos(p_NombreProducto, p_CodCampoRefugiado, p_FechaInicio, p_FechaFin, v_CantidadTotal);
if v_CantidadTotal >0 then
return v_CantidadTotal;
else
RAISE EXCEPTION 'No se ha enviado ninguna cantidad de %',p_NombreProducto;
end if;
END;
$$ LANGUAGE plpgsql;
----------------------------------------------------------------------------------------CREATE OR REPLACEFUNCTIONSaberCodigoEnviosValidos(p_NombreProducto productos.nombre%TYPE,
p_CodCampoRefugiado campos_refugiados.codigo%TYPE,
p_FechaInicio envios.fecha_hora%TYPE,
p_FechaFin envios.fecha_hora%TYPE)
returns NUMERICAS $$
DECLARE
reg RECORD;
c_CodigoEnvios CURSOR FOR
SELECT codigo
FROM envios
WHERE to_char(fecha_hora,'YYYY/MM/DD') >= to_char(p_FechaInicio,'YYYY/MM/DD')
AND to_char(fecha_hora,'YYYY/MM/DD') <= to_char(p_FechaFin,'YYYY/MM/DD');
v_CantidadTotal paquetes.cantidad%TYPE :=0;
BEGIN
for reg in c_CodigoEnvios loop
v_CantidadTotal:=SaberCantidadTotal(reg.codigo, p_CodCampoRefugiado, p_NombreProducto, v_CantidadTotal);
end loop;
return v_CantidadTotal;
END;
$$ LANGUAGE plpgsql;
----------------------------------------------------------------------------------------CREATE OR REPLACEFUNCTIONSaberCantidadTotal(p_CodigoEnvio VARCHAR,
p_CodigoCampo VARCHAR,
p_NombreProducto VARCHAR,
p_CantidadTotal NUMERIC)
returns NUMERICAS $$
DECLARE
reg RECORD;
c_CantidadProducto CURSOR FOR
SELECT cantidad
FROM paquetes
WHERE codigo_envio = p_CodigoEnvio
AND codigo_refugiados = p_CodigoCampo
AND nombre_producto = p_NombreProducto;
BEGIN
for reg in c_CantidadProducto loop
p_CantidadTotal :=reg.cantidad+ p_CantidadTotal;
end loop;
return p_CantidadTotal;
END;
$$ LANGUAGE plpgsql;
----------------------------------------------------------------------------------------SELECT ComprobarExcepciones('Legumbres','140','1990/04/01','2009/04/01');
CREATE OR REPLACEFUNCTIONComprobarExcepciones(p_NombreProducto productos.nombre%TYPE,
p_CodCampoRefugiado campos_refugiados.codigo%TYPE,
p_FechaInicio envios.fecha_hora%TYPE,
p_FechaFin envios.fecha_hora%TYPE)
returns VOID AS $$
DECLARE
BEGIN
PERFORM ExceptionProductoInexistente(p_NombreProducto);
PERFORM ExceptionCodCampoInexistente(p_CodCampoRefugiado);
PERFORM ExceptionEnvioEntreFechas(p_FechaInicio, p_FechaFin);
END;
$$ LANGUAGE plpgsql;
----------------------------------------------------------------------------------------CREATE OR REPLACEFUNCTIONExceptionProductoInexistente (p_NombreProducto productos.nombre%TYPE)
returns VOID AS $$
DECLARE
v_ContadorDeProducto NUMERIC;
BEGINSELECTcount(nombre) INTO v_ContadorDeProducto
FROM productos
WHERE nombre = p_NombreProducto;
if v_ContadorDeProducto =0 then
RAISE EXCEPTION 'ERROR, Nombre de producto no encontrado' ;
end if;
END;
$$ LANGUAGE plpgsql;
----------------------------------------------------------------------------------------CREATE OR REPLACEFUNCTIONExceptionCodCampoInexistente(p_CodigoCampo campos_refugiados.codigo%TYPE)
returns VOID AS $$
DECLARE
v_ContadorCodCampo NUMERIC;
BEGINSELECTcount(codigo) INTO v_ContadorCodCampo
FROM campos_refugiados
WHERE codigo = p_CodigoCampo;
if v_ContadorCodCampo =0 then
RAISE EXCEPTION 'ERROR, Codigo de campo de refugido no encontrado';
end if;
END;
$$ LANGUAGE plpgsql;
---------------------------------------------------------------------------------CREATE OR REPLACEFUNCTIONExceptionEnvioEntreFechas(p_FechaInicio envios.fecha_hora%TYPE,
p_FechaFin envios.fecha_hora%TYPE)
returns VOID AS $$
DECLARE
v_ContadorEnvios NUMERIC;
BEGINSELECTcount(codigo) INTO v_ContadorEnvios
FROM envios
WHERE to_char(fecha_hora,'YYYY/MM/DD') >= to_char(p_FechaInicio,'YYYY/MM/DD')
AND to_char(fecha_hora,'YYYY/MM/DD') <= to_char(p_FechaFin,'YYYY/MM/DD');
if v_ContadorEnvios =0 then
RAISE EXCEPTION 'No hay envios entre las dos fechas dadas';
end if;
END;
$$ LANGUAGE plpgsql;
Tarea 3.
Realizar un trigger que garantice que una organización mediadora con menos de diez personas desplegadas en un conflicto no pueda ofrecer ayuda de tipo Ayuda Humanitaria.
CREATE OR REPLACEFUNCTIONORGNoMenosDiezUpdate()
RETURNS TRIGGER AS $ORGNoMenosDiez$
BEGIN
PERFORM ComprobarDatos(old.numpersonas_conflicto, new.numpersonas_conflicto, old.tipo, new.tipo);
RETURN NEW;
END;
$ORGNoMenosDiez$ LANGUAGE plpgsql;
CREATE OR REPLACEFUNCTIONComprobarDatosUpdate(p_NumPersonasAntes NUMERIC,
p_NumPersonasDespues NUMERIC,
p_TipoAyudaAntes VARCHAR,
p_TipoAyudaDespues VARCHAR)
returns VOID AS $$
DECLARE
BEGIN
if p_NumPersonasAntes <10AND p_TipoAyudaDespues ='Accion Humanitaria' then
RAISE EXCEPTION 'ERROR, Tipo de ayuda no valido';
elseif p_NumPersonasDespues <10AND p_TipoAyudaAntes ='Accion Humanitaria' then
RAISE EXCEPTION 'ERROR, Numero de personas no valido';
end if;
END;
$$ LANGUAGE plpgsql;
CREATETRIGGERORGNoMenosDiezUpdate BEFORE UPDATEON organizaciones FOR EACH row
EXECUTE PROCEDURE ORGNoMenosDiezUpdate();
------------------------------------------------------------------------------------CREATE OR REPLACEFUNCTIONORGNoMenosDiezInsert()
RETURNS TRIGGER AS $ORGNoMenosDiez$
BEGIN
if new.numpersonas_conflicto<10ANDnew.tipo='Accion Humanitaria' then
RAISE EXCEPTION 'ERROR, Numero de personas y tipo no valido';
end if;
RETURN NEW;
END;
$ORGNoMenosDiez$ LANGUAGE plpgsql;
CREATETRIGGERORGNoMenosDiezInsert BEFORE INSERT
ON organizaciones FOR EACH row
EXECUTE PROCEDURE ORGNoMenosDiezInsert();