Anda di halaman 1dari 7

Practica No.

9 Funciones
Objetivo

Crear funciones con parmetros de entrada y salida, que contengan consultas


SQL y estructura de control.
CREATE FUNCTION nombre_funcion (param1,
CREATE FUNCTION nombre_funcion (param1,
param2,...paramN)
param2,...paramN)
RETURNS
tipo_dato AS $$
RETURNS tipo_dato AS $$
DECLARE
DECLARE
identificador1 := expresion1;
identificador1:=:=expresionN;
expresion1;
identificadorN
identificadorN
:=
expresionN;
BEGIN
BEGIN
Estructura de control o
Estructura
de control o
Consultas
SQL.
Consultas SQL.
RETURN tipo_dato;
RETURN tipo_dato;
END;
$$END;
LANGUAGE 'plpgsql';
$$ LANGUAGE 'plpgsql';

Actividades: siguiendo la estructura anterior realice las siguientes funciones:


Paso 1

Crear una funcin 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
result:=result ||
'\n';

$$;

Paso 2

materiales LOOP
reg.nombrematerial

||

END LOOP;
return result;
end;

Crear una funcin sp_mas_solicitudes que muestre cual edificacin es la que


tiene mximo numero de solicitudes de servicios.
CREATE FUNCTION mas_edificaciones() RETURNS char

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 funcin sp_devoluciones que retorne el registro completo de


las herramientas y edificaciones donde se utilizaron y que estn 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 funcin llamada sp_con_entrada que tenga los parmetros de


entrada p_NroOrdenC

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 parmetros 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;
end;

return resultado;

$_$;
Paso 5

Implementar una funcin sp_mas_caro que retorne el registro completo del


material ms 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 by


ultimoprecio desc limit 1 LOOP
precio:=precio || data.ultimoprecio||' \n';
END LOOP;
end;

return precio;

$$;

Paso 6

Funcin sp_punto_pedido con parmetro 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 requisicin.
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;
$_$;
Paso 7

end;

Elaborar que una funcin sp_generar_requisicin con parmetros de entrada


para insertar en la tabla requisicin_almacn. Que permita determinar los
idfamilia, idgrupo, idmaterial, punto mximo y cantidad de medida de los
materiales cuya Cantidad En Mano sea mayor o igual que Punto Pedido. A
partir de esta condicin inserte los resultados de dichos materiales en la tabla
detalles de requisicin.
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 funcin llamada sp_ultimo_precio que tenga el cdigo compuesto


del material como parmetro de entrada y permita actualizar el material donde
el ultimo precio sera el precio unitario del material de detalles de materiales
segn cdigo 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 funcin sp_ultimo_precio que actualice el ultimo precio de los

materiales segn 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;
$_$;
Paso 10

end;

Programe una funcin sp_calcular que contenga el cursor anterior y que


tome en consideracin los parmetros m_idfamilia, m_idgrupo, m_idmaterial.
CREATE OR REPLACE FUNCTION
RETURNS void AS
$BODY$

sp_calcular(char, char, char)

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 and
idmaterial=m_IdMaterial;
end loop;
close cr_materiales;
end;
$BODY$
LANGUAGE 'plpgsql'

Anda mungkin juga menyukai