Sunteți pe pagina 1din 2

--------------------------------------------------------------------------------------------------------Genera Ventas---------------------------------------------------------------------------------------create or replace PROCEDURE genera_ventas IS vTienda tienda.tienda%TYPE; vCliente cliente.cliente%TYPE; vProducto producto.

producto%TYPE; vFechaIni DATE := TO_DATE ( '01012005', 'DDMMYYYY' ); vFechaFin DATE := TRUNC ( SYSDATE ); BEGIN DBMS_RANDOM.initialize ( TO_NUMBER ( TO_CHAR ( SYSDATE, 'HH24MMSS' ) ) ); FOR i IN 1..10000 LOOP SELECT MAX ( tienda ) INTO vTienda FROM tienda; SELECT MAX ( cliente ) INTO vCliente FROM cliente; SELECT MAX ( producto ) INTO vProducto FROM producto; vTienda := 1 + ABS ( MOD ( DBMS_RANDOM.random, vTienda ) ); vCliente := 1 + ABS ( MOD ( DBMS_RANDOM.random, vCliente ) ); vProducto := 1 + ABS ( MOD ( DBMS_RANDOM.random, vProducto ) ); INSERT INTO venta ( cliente, producto, tienda, precio, fecha, cantidad ) SELECT vCliente, vProducto, vTienda, precio, vFechaIni + ABS ( MOD ( DBMS_RANDOM.random, vFechaFin vFechaIni ) ), 1 + ABS ( MOD ( DBMS_RANDOM.random, 10 ) ) FROM producto WHERE producto = vProducto; END LOOP; COMMIT; END; --------------------------------------------------------------------------------------------------------Procesa Ventas---------------------------------------------------------------------------------------create or replace PROCEDURE procesa_ventas IS vTotal total_venta.total%TYPE; vAo total_venta.ao%TYPE; vMes total_venta.mes%TYPE; vDia total_venta.dia%TYPE; vNombreTienda tienda.nombre%TYPE; vNombreCliente cliente.nombre%TYPE; vNombreProducto producto.nombre%TYPE; CURSOR tot IS SELECT DISTINCT tienda, cliente, producto FROM venta WHERE procesado = 'N'; CURSOR ven ( pTienda tienda.tienda%TYPE, pCliente cliente.cliente%TYPE, pProducto producto.producto%TYPE ) IS SELECT * FROM venta WHERE procesado = 'N' AND tienda = pTienda AND cliente = pCliente AND producto = pProducto; BEGIN FOR t IN tot LOOP BEGIN -- Retiene la filas para evitar que otro proceso ---------------------- actualice las tablas durante la transaccin en curso -------------SELECT nombre INTO vNombreTienda FROM tienda WHERE tienda = t.tienda FOR UPDATE NOWAIT; SELECT nombre INTO vNombreCliente FROM cliente WHERE cliente = t.cliente FOR UPDATE NOWAIT; SELECT nombre INTO vNombreProducto FROM producto WHERE producto = t.producto FOR UPDATE NOWAIT; ---------------------------------------------------------------------FOR v IN ven ( t.tienda, t.cliente, t.producto ) LOOP vTotal := v.precio * v.cantidad; vAo :=

TO_NUMBER ( TO_CHAR ( v.fecha, 'YYYY' ) ); vMes := TO_NUMBER ( TO_CHAR ( v.fecha, 'MM' ) ); vDia := TO_NUMBER ( TO_CHAR ( v.fecha, 'DD' ) ); -- Actualiza total tienda ----------------------------------------UPDATE total_tienda SET total = total + vTotal WHERE tienda = v.tienda; IF SQL%NOTFOUND THEN INSERT INTO total_tienda ( tienda, nombre, total ) VALUES ( v.tienda, vNombreTienda, vTotal ); END IF; ------------------------------------------------------------------- -- Actualiza total cliente ---------------------------------------UPDATE total_cliente SET total = total + vTotal WHERE cliente = v.cliente; IF SQL%NOTFOUND THEN INSERT INTO total_cliente ( cliente, nombre, total ) VALUES ( v.cliente, vNombreCliente, vTotal ); END IF; ------------------------------------------------------------------- -- Actualiza total producto --------------------------------------UPDATE total_producto SET total = total + vTotal , cantidad = cantidad + v.cantidad WHERE producto = v.producto; IF SQL%NOTFOUND THEN INSERT INTO total_producto ( producto, nombre, total, cantidad ) VALUES ( v.producto, vNombreProducto, vTotal, v.cantidad ); END IF; ------------------------------------------------------------------- -- Actualiza total venta --------------------------------------UPDATE total_venta SET total = total + vTotal , cantidad = cantidad + v.cantidad WHERE tienda = v.tienda AND cliente = v.cliente AND producto = v.producto AND ao = vAo AND mes = vMes AND dia = vDia; IF SQL%NOTFOUND THEN INSERT INTO total_venta ( tienda, cliente, producto, ao, mes, dia, nombre_tienda, nombre_cliente, nombre_producto, total, cantidad ) VALUES ( v.tienda, v.cliente, v.producto, vAo, vMes, vDia, vNombreTienda, vNombreCliente, vNombreProducto, vTotal, v.cantidad ); END IF; ------------------------------------------------------------------UPDATE venta SET procesado = 'S' WHERE venta = v.venta; END LOOP; COMMIT; EXCEPTION WHEN TIMEOUT_ON_RESOURCE OR NO_DATA_FOUND THEN NULL; END; END LOOP; END;

S-ar putea să vă placă și