View
17
Download
1
Category
Preview:
DESCRIPTION
PostgreSQL
Citation preview
Practica No. 9 – Funciones
Objetivo Crear funciones con parámetros de entrada y salida, que contengan consultas
SQL y estructura de control.
Actividades: siguiendo la estructura anterior realice las siguientes funciones:
Paso 1 Crear una función para listar todos los materiales
CREATE FUNCTION listamaterial() RETURNS text LANGUAGE plpgsql AS $$
declare reg materiales%ROWTYPE; result TEXT:= '\n';
begin FOR reg IN SELECT * FROM materiales LOOP
result:=result || reg.nombrematerial ||'\n';
END LOOP; return result; end;
$$;
Paso 2 Crear una función sp_mas_solicitudes que muestre cual edificación es la que
tiene máximo numero de solicitudes de servicios.
CREATE FUNCTION mas_edificaciones() RETURNS char
CREATE FUNCTION nombre_funcion (param1, param2,...paramN)RETURNS tipo_dato AS $$DECLARE
identificador1 := expresion1;identificadorN := expresionN;
BEGIN Estructura de control o Consultas SQL.
RETURN tipo_dato;END;$$ LANGUAGE 'plpgsql';
CREATE FUNCTION nombre_funcion (param1, param2,...paramN)RETURNS tipo_dato AS $$DECLARE
identificador1 := expresion1;identificadorN := expresionN;
BEGIN Estructura de control o Consultas SQL.
RETURN tipo_dato;END;$$ LANGUAGE 'plpgsql';
LANGUAGE plpgsql AS $$
declare nombre_edificaciones char ;
begin
select max(E.nombreedificacion) into nombre_edificaciones
from (select count(SS.idedificacion) from servicios.solicitudes_de_servicios SS,
servicios.edificaciones E where SS.idinfraestructura=E.idinfraestructura) as
cantidad , servicios.edificaciones E; return nombre_edificaciones;
end; $$;
Paso 3 Implementar una función sp_devoluciones que retorne el registro completo de
las herramientas y edificaciones donde se utilizaron y que están pendientes por
devoluciones.
CREATE FUNCTION sp_devoluciones() RETURNS record LANGUAGE plpgsql AS $$ declare registro record; begin for registro in select * from servicios.vistafunciones2 where sinentregar > 0 loop end loop; return registro; end; $$;
Paso 4 Crear una función llamada sp_con_entrada que tenga los parámetros de
entrada p_NroOrdenC y p_NroNotaE y que contenga una consulta de
material, ultimo precio, cantidad y unidad de medida cuyos campos de
NroOrdenCompra y NroNotaEntrega sean igual a los parámetros de entrada.
CREATE FUNCTION sp_con_entrada(char, char) RETURNS materiales LANGUAGE plpgsql AS $_$
declare pnroorden alias for $1; pnronota alias for $2; resultado materiales%rowtype;
begin
select materiales.nombrematerial, materiales.cantidadenmano, materiales.unidaddemedida
into resultado from detalles_de_entrada ,materiales
where detalles_de_entrada.idmaterial= materiales.idmaterial
and detalles_de_entrada.nroordencompra=pnroorden
and detalles_de_entrada.nronotaentrega=pnronota;
return resultado;
end; $_$;
Paso 5 Implementar una función sp_mas_caro que retorne el registro completo del
material más caro.
CREATE FUNCTION sp_mas_caro() RETURNS text LANGUAGE plpgsql AS $$
declare precio text:='\n'; data materiales%ROWTYPE; /*prestamo TEXT;*/ herramienta integer;
begin
for data in select * from materiales order byultimoprecio desc limit 1 LOOP
precio:=precio || data.ultimoprecio||' \n';END LOOP; return precio;
end; $$;
Paso 6 Función sp_punto_pedido con parámetro de entrada de idfamilia, idgrupo y
idmaterial permita determinar si el punto de pedido es igual cantidad en mano e
mostrar un mensaje de “Debe generar requisición”.
CREATE FUNCTION sp_punto_pedido(char, char, char) RETURNS text LANGUAGE plpgsql AS $_$
declare
familia alias for $1; material alias for $2; grupo alias for $3; precio text:=''; data materiales%ROWTYPE;
begin for data in select * from materiales where
materiales.idmaterial=material and materiales.idfamilia=familia and materiales.idgrupo=grupo and materiales.puntopedido<=
materiales.cantidadenmano LOOP
precio:=precio || 'Debe Generar Requisicion'||' \n';
END LOOP; return precio;
end; $_$;
Paso 7 Elaborar que una función sp_generar_requisición con parámetros de entrada
para insertar en la tabla requisición_almacén. Que permita determinar los
idfamilia, idgrupo, idmaterial, punto máximo y cantidad de medida de los
materiales cuya Cantidad En Mano sea mayor o igual que Punto Pedido. A
partir de esta condición inserte los resultados de dichos materiales en la tabla
detalles de requisición.
CREATE FUNCTION sp_generar_requisicion() RETURNS text LANGUAGE plpgsql AS $$ declare resultado text; i integer; requisicion varchar; begin i:=6; for resultado in select * from materiales where cantidadenmano >= puntopedido loop requisicion = i; insert into requisicion_al_almacen values (requisicion, now(), 1, 1, 1); insert into detalle_requisicion (idfamilia,idgrupo,idmaterial, cantidadrequerida,unidadmedida) select 1,idfamilia,idgrupo,idmaterial,puntomaximo,unidaddemedida from materiales where cantidadenmano >= puntopedido;
end loop; return resultado; end; $$;
Paso 8 Crear una función llamada sp_ultimo_precio que tenga el código compuesto
del material como parámetro de entrada y permita actualizar el material donde
el ultimo precio sera el precio unitario del material de detalles de materiales
según código compuesto del material.
CREATE FUNCTION sp_ultimo_precio(char, char, char) RETURNS text LANGUAGE plpgsql AS $_$
declare familia alias for $1; material alias for $2; grupo alias for $3; precio text:='';
begin update materiales set ultimoprecio=(select detalles_de_entrada
.preciou from detalles_de_entrada where detalles_de_entrada
.idfamilia=familia and detalles_de_entrada
.idgrupo='grupo' and detalles_de_entrada
.idmaterial=material) where materiales.idfamilia=familia and
materiales.idmaterial=material and materiales.idgrupo=grupo; if FOUND then precio:=precio || 'actualizado correctamente'; else
precio:=precio || 'NO actualizo correctamente';
end if; return precio;
end; $_$;
Paso 9 Crear una función sp_ultimo_precio que actualice el ultimo precio de los
materiales según un trigger tg_ultimo_precio que al insertar un material en
detalles utilice el campo ultimo precio.
CREATE TRIGGER tg_ultimo_precio BEFORE INSERT ON detalles_de_entrada FOR EACH ROW EXECUTE PROCEDURE sp_up_ultimo_precio();
CREATE FUNCTION sp_ultimo_precio(char, char, char) RETURNS text LANGUAGE plpgsql AS $_$
declare familia alias for $1; material alias for $2; grupo alias for $3; precio text:='';
begin update materiales set ultimoprecio=(select detalles_de_entrada
.preciou from detalles_de_entrada where detalles_de_entrada
.idfamilia=familia and detalles_de_entrada
.idgrupo='grupo' and detalles_de_entrada
.idmaterial=material) where materiales.idfamilia=familia and
materiales.idmaterial=material and materiales.idgrupo=grupo; if FOUND then precio:=precio || 'actualizado correctamente'; else
precio:=precio || 'NO actualizo correctamente';
end if; return precio;
end; $_$;
Paso 10 Programe una función “sp_calcular” que contenga el cursor anterior y que
tome en consideración los parámetros m_idfamilia, m_idgrupo, m_idmaterial.
CREATE OR REPLACE FUNCTION sp_calcular(char, char, char) RETURNS void AS $BODY$
declare cr_materiales refcursor; m_IdFamilia m_IdGrupo m_IdMaterial begin open cr_materiales for select IdFamilia,IdGrupo,IdMaterial from materiales order by IdFamilia,IdGrupo,IdMaterial; loop fetch next from cr_materiales into m_IdFamilia, m_IdGrupo, m_IdMaterial; exit when not found;
update materiales set cantidadenmano = (select ex.existencia from vw_existencias ex
where ex.idfamilia=m_IdFamilia and ex.idgrupo=m_IdGrupo and ex.idmaterial=m_IdMaterial) where idfamilia=m_IdFamilia and dgrupo=m_IdGrupo andidmaterial=m_IdMaterial;
end loop;
close cr_materiales; end;
$BODY$ LANGUAGE 'plpgsql'
Recommended