Prueba de Bases de Datos. 21 de Mayo de 2013. Triggers y bases de datos distribuidas






descargar 26.02 Kb.
títuloPrueba de Bases de Datos. 21 de Mayo de 2013. Triggers y bases de datos distribuidas
fecha de publicación12.02.2016
tamaño26.02 Kb.
tipoDocumentos
Prueba de Bases de Datos. 21 de Mayo de 2013. Triggers y bases de datos distribuidas
La estación de servicio DER LEKLER decide informatizar el proceso de compra y venta de carburantes creando una base de datos llamada gasolinera con las siguientes tablas:
Tabla productos: dispone de los datos de los combustibles que vende.

Campos y valores iniciales:

Tabla reposiciones: Anota datos cada vez que se abastece de un combustible determinado.

Campos y valores iniciales:

Tabla ventas: Se anota cada venta de combustible a particulares.

Campos y valores iniciales:

Tabla hay_que_comprar: En ella se registra lo que es necesario reponer y en qué cantidad.

Campos y valores iniciales:



1.- Implementación de disparadores:



Crear los triggers (disparadores) necesarios para que la base de datos funcione así:

  • Cuando se haga una venta de combustible a un cliente particular

    • El precio de la venta tomará su valor de la tabla productos

  • Cuando se haga una reposición o relleno de un tanque de combustible

    • El precio variará y se actualizará el campo correspondiente en la tabla productos. Para calcular el nuevo precio es necesario promediar teniendo en cuenta lo que quedaba en el tanque y lo que se carga (litros_que_habia*precio_anterior+litros_nuevos*precio_nuevo)/(litros_totales).

    • Por ejemplo si había 1000 litros a 1.5 y se cargan 500 litros a 1.7 el nuevo precio será (1000*1,5+500*1,7)/1500=1,5666.

  • La tabla hay_que_comprar deberá estar permanentemente actualizada

    • Si existe algún producto cuyas existencias (diferencia entre las reposiciones y las ventas) sean inferiores al stock_minimo, (hay menos producto del deseable) figurará en la tabla hay_que_comprar indicando la fecha actual, el producto que hay que comprar y la cantidad mínima que hay que pedir para que haya, al menos existencias iguales al stock_minimo



2.- Acceso a bases de datos distribuidas



Crear una nueva base de datos llamada petrolera con una tabla llamada carburantes con el siguiente contenido


Dentro de esta nueva base de datos



a) Crear una vista llamada necesidades que muestre las necesidades de combustible de la gasolinera

Los campos cod_producto y cantidad los saca de la tabla hay_que_comprar, producto de la tabla productos, precio lo saca de la tabla carburantes
b) Crear una función que inserte en la tabla reposiciones de la base de datos gasolinera el doble del campo cantidad de la vista anterior. Pista: usar la orden select dblink_exec(conexión,SQL)

3.- Juego de pruebas del programa (Partiendo de las tablas creadas y con los valores iniciales)


a) Reposición del producto 1: 1000 litros a 1.41

b) Reposición del producto 1: 500 litros a 1.25

c) Venta del producto 1: 35 litros

La base de datos gasolinera tendrá entonces el siguiente contenido en sus distintas tablas:
Reposiciones


Productos


Ventas


Hay_que_pedir



Carburantes


Necesidades


Ejecutamos la función recarga_gasolinera()



Reposiciones


Productos:



Función disparadora: nueva_venta. AFTER INSERT ventas

DECLARE

a double precision;

BEGIN

-- Leo el precio del producto para ponerlo en la venta

SELECT precio INTO a FROM productos WHERE cod_producto=new.cod_producto;
-- Actualizo el precio de la venta recién hecha

UPDATE ventas SET precio=a WHERE cod_venta=new.cod_venta;
-- (Ñapa) Actualizo la tabla productos para que dispare el tercer trigger y compruebe si falta algo

UPDATE productos set precio=precio;
RETURN null;

END

Función disparadora: nueva_reposicion. AFTER INSERT reposiciones

DECLARE

a double precision;

b double precision;

litros_quedaban double precision;

precio_actual double precision;

nuevo_precio double precision;

BEGIN

-- Litros que se repusieron antes de la recarga

SELECT sum(cantidad) INTO a

FROM reposiciones

WHERE cod_producto=new.cod_producto

AND cod_reposicion<>new.cod_reposicion;

if (a is null) THEN a=0; END IF;
-- Litros que se gastaron de ese producto

SELECT sum(cantidad) INTO b

FROM ventas

WHERE cod_producto=new.cod_producto;

IF (b is null) THEN b=0; END IF;
-- Litros que quedan

litros_quedaban=a-b;
-- Precio actual

SELECT precio INTO precio_actual FROM productos WHERE cod_producto=new.cod_producto;
-- Calculo el nuevo precio

nuevo_precio=(litros_quedaban*precio_actual+new.cantidad*new.precio)/(litros_quedaban+new.cantidad);
-- Cambio el precio del producto

UPDATE productos SET precio=nuevo_precio WHERE cod_producto=new.cod_producto;
RETURN null;

END;

Función disparadora: actualizando_productos. AFTER UPDATE productos

Se dispara cuando hago reposicion de productos (cambia el precio) y cuando hago venta de productos (ver la ñapa que hace ese disparador)

DECLARE

reg RECORD;

a double precision;

b double precision;

quedan double precision;

necesario double precision;

BEGIN

-- Borro todo el contenido de la tabla hay_que_comprar para empezar desde 0

DELETE FROM hay_que_comprar;
-- Miro uno a uno los productos para ver si tienen menos del stock minimo

FOR reg IN SELECT cod_producto,descripcion,stock_minimo FROM productos LOOP
-- Calculo los litros que se han cargado de ese producto

SELECT SUM(cantidad) INTO a FROM reposiciones WHERE cod_producto=reg.cod_producto;

IF (a is null) THEN a=0; END IF;
-- Calculo los litros vendidos

SELECT SUM(cantidad) INTO b FROM ventas WHERE cod_producto=reg.cod_producto;

IF (b is null) THEN b=0; END IF;
-- A ver cuantos quedan

quedan=a-b;
-- Si hay menos que el stock_minimo entonces doy de alta en hay_que_comprar

IF (quedan
necesario=reg.stock_minimo-quedan;

INSERT INTO hay_que_comprar VALUES(now(),reg.descripcion,necesario);

END IF;
END LOOP;

RETURN null;

END

Vista necesidades en petrolera

SELECT t.cod_producto, t.producto, t.cantidad, c.precio

FROM dblink('dbname=gasolinera port=5432 host=localhost user=postgres password=root',

'SELECT cod_producto,producto,cantidad FROM hay_que_comprar,productos

WHERE productos.descripcion=hay_que_comprar.producto')

t(cod_producto integer, producto character varying(100), cantidad double precision),

carburantes c

WHERE t.producto = c.descripcion;

Funcion en petrolera

declare

sentencia character varying(100);

daigual character varying(100);

reg record;

begin

-- Recorreremos uno a uno los registros de la vista necesidades

FOR reg IN select cod_producto,cantidad,precio FROM necesidades LOOP
-- Genero la sentencia SQL INSERT INTO

sentencia='INSERT INTO reposiciones (cod_producto,cantidad,precio)

VALUES ('||reg.cod_producto||','||(reg.cantidad*2)||','||reg.precio||')';
-- Inserto en remoto usando la SENTENCIA dblink_exec(connexion,SQL)

select dblink_exec('dbname=gasolinera

port=5432

host=localhost

user=postgres

password=root',sentencia) into daigual;

END LOOP;
-- Mensaje de salida

return 'Recarga efectuada correctamente';

end

similar:

Prueba de Bases de Datos. 21 de Mayo de 2013. Triggers y bases de datos distribuidas iconAccess: bases de datos – tablas

Prueba de Bases de Datos. 21 de Mayo de 2013. Triggers y bases de datos distribuidas iconBases técnicas para el concurso nacional oficial de vaulting e invitacional...

Prueba de Bases de Datos. 21 de Mayo de 2013. Triggers y bases de datos distribuidas iconBases concurso de graffiti

Prueba de Bases de Datos. 21 de Mayo de 2013. Triggers y bases de datos distribuidas iconBases psicopedagógicas de la educación especial

Prueba de Bases de Datos. 21 de Mayo de 2013. Triggers y bases de datos distribuidas iconBases generales de los participantes

Prueba de Bases de Datos. 21 de Mayo de 2013. Triggers y bases de datos distribuidas iconBases para la aplicación de la cultura física terapéutica

Prueba de Bases de Datos. 21 de Mayo de 2013. Triggers y bases de datos distribuidas iconBases, reglamento del campeonato nacional master 2012

Prueba de Bases de Datos. 21 de Mayo de 2013. Triggers y bases de datos distribuidas iconTema 1 bases conceptuales de la educación para la salud y la calidad de vida

Prueba de Bases de Datos. 21 de Mayo de 2013. Triggers y bases de datos distribuidas iconTema 1 bases conceptuales de la educación para la salud y la calidad de vida

Prueba de Bases de Datos. 21 de Mayo de 2013. Triggers y bases de datos distribuidas iconDatos generales






Todos los derechos reservados. Copyright © 2015
contactos
f.se-todo.com