Ejemplos funciones

7
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';

description

PostgreSQL

Transcript of Ejemplos funciones

Page 1: Ejemplos funciones

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';

Page 2: Ejemplos funciones

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;

Page 3: Ejemplos funciones

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

Page 4: Ejemplos funciones

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;

Page 5: Ejemplos funciones

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

Page 6: Ejemplos funciones

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$

Page 7: Ejemplos funciones

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'