práctica de base de datos distribuidas

23
LABORATORIO Asuma que en un método de diseño de bases de datos distribuidas se tiene el siguiente modelo conceptual global de una Base de datos de facturación. CLIENTES = (CEDULA, NOMBRE) CP = CEDULA SUCURSALES (CODIGO, NOMBRE, DIRECCION) CP = CODIGO D_CODIGO = Una letra mayúscula en (‘N’, ‘S’, ‘E’, ‘C’, ‘O’) PRODUCTOS = (CODIGOP, DESCRIPCION, STOCK, FABRICANTE, DIMENCIONES, FECHA) CP = CODIGOP FACTURAS = (NUMERO, FECHA, VALOR, CLIENTE, SUCURSAL) CP = NUMERO D_NUMERO = 10 Caracteres, el primero de la izquierda es la letra correspondiente al código de la sucursal donde se emite la factura, los demás caracteres dan un número > 0 CF1 = CLIENTE, se refiere a CLIENTES en CEDULA CF2 = SUCURSAL, se refiere a SUCURSALES en CODIGO VENTAS = (FACTURA, CANTIDAD, PRECIO, PRODUCTO) CF3 = FACTURA, se refiere a FACTURAS en NUMERO CF4 = PRODUCTO, se refiere a PRODUCTOS en CODIGOP. Las siguientes especificaciones se han extractado del documento de requerimientos: a) Las sucursales están ubicadas en sitios convenientes de acuerdo a una masificación poblacional. b) Un cliente puede comprar en cualquier sucursal c) Algunas sucursales pueden tener todos los productos, otras solamente los más solicitados en el lugar. d) El stock de cada producto es dependiente de la sucursal. Por ejemplo, en la sucursal “N” puede haber 10 palas anchas, en la sucursal “S” puede haber solo 7.

Upload: csaguay

Post on 23-Dec-2015

8 views

Category:

Documents


1 download

DESCRIPTION

Es una práctica sobre distribución de datos en Oracle

TRANSCRIPT

Page 1: práctica de base de datos distribuidas

LABORATORIO

Asuma que en un método de diseño de bases de datos distribuidas se tiene el siguiente modelo conceptual global de una Base de datos de facturación.

CLIENTES = (CEDULA, NOMBRE)CP = CEDULA

SUCURSALES (CODIGO, NOMBRE, DIRECCION)CP = CODIGOD_CODIGO = Una letra mayúscula en (‘N’, ‘S’, ‘E’, ‘C’, ‘O’)

PRODUCTOS = (CODIGOP, DESCRIPCION, STOCK, FABRICANTE, DIMENCIONES, FECHA)CP = CODIGOP

FACTURAS = (NUMERO, FECHA, VALOR, CLIENTE, SUCURSAL)CP = NUMEROD_NUMERO = 10 Caracteres, el primero de la izquierda es la letra correspondiente al código de la sucursal donde se emite la factura, los demás caracteres dan un número > 0CF1 = CLIENTE, se refiere a CLIENTES en CEDULACF2 = SUCURSAL, se refiere a SUCURSALES en CODIGO

VENTAS = (FACTURA, CANTIDAD, PRECIO, PRODUCTO)CF3 = FACTURA, se refiere a FACTURAS en NUMEROCF4 = PRODUCTO, se refiere a PRODUCTOS en CODIGOP.

Las siguientes especificaciones se han extractado del documento de requerimientos:

a) Las sucursales están ubicadas en sitios convenientes de acuerdo a una masificación poblacional.

b) Un cliente puede comprar en cualquier sucursalc) Algunas sucursales pueden tener todos los productos, otras solamente los más

solicitados en el lugar. d) El stock de cada producto es dependiente de la sucursal. Por ejemplo, en la

sucursal “N” puede haber 10 palas anchas, en la sucursal “S” puede haber solo 7.

PRIMERA PARTE: REPLICACION.

SITIO SRV1 (SITIO 1).

CREATE DATABASE LINK SITIO2CONNECT TO USUARIOX IDENTIFIED BY USUARIOXUSING ‘(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = SITIO2)(PORT = 1521)) ) (CONNECT_DATA =

Page 2: práctica de base de datos distribuidas

(SERVICE_NAME = orcl) ) )’;

SELECT * FROM TAB@SITIO2;

CREATE TABLE CLIENTES(CEDULA VARCHAR (10) PRIMARY KEY,NOMBRE CHAR (40));

CREATE SNAPSHOT LOG ON CLIENTES;

COLUMN OBJECT_NAME FORMAT A20;COLUMN OBJECT_NAME FORMAT A20;

SELECT OBJECT_NAME, OBJECT_TYPEFROM USER_OBJECTS;

SITIO SRV2 (SITIO 2).

CREATE DATABASE LINK SITIO1CONNECT TO USUARIOX IDENTIFIED BY USUARIOXUSING ‘(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = SITIO1)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = orcl) ) )’;

CREATE SNAPSHOT S_CLIENTESREFRESH FASTSTART WITH SYSDATENEXT SYSDATE + 0.0001WITH PRIMARY KEYASSELECT * FROM CLIENTES@SITIO1;

SELECT * FROM S_CLIENTES;

INSERT INTO S_CLIENTES VALUES (‘1700003238’,’PAUL FUERTES’); No se puede ingresar datos en una vista materializada.

Page 3: práctica de base de datos distribuidas

INSERT INTO CLIENTES@SITIO1VALUES(‘1700003238’,’PAUL FUERTES’);

COMMIT;

SELECT * FROM S_CLIENTES;

CREATE SYNONYM CLIENTES FOR CLIENTES@SITIO1;

INSERT INTO CLIENTESVALUES(‘1700003239’,’LUIS VILLAFUERTE’);

COMMIT;

SELECT * FROM S_CLIENTES;

SELECT * FROM CLIENTES;

SEGUNDA PARTE: FRACCIONAMIENTO HORIZONTAL PRIMARIO.

SUCURSALES (CODIGO, NOMBRE, DIRECCION)CP = CODIGOD_CODIGO = Una letra mayúscula en (‘N’, ‘S’, ‘E’, ‘C’, ‘O’)

EN EL SITIO SRV1 (SITIO 1).

CREATE TABLE SUCURSALES(CODIGO CHAR (1) PRIMARY KEYCHECK (CODIGO IN (‘S’)),NOMBRE CHAR (30),DIRECCION CHAR (30));

EN EL SITIO SRV2 (SITIO 2).

CREATE TABLE SUCURSALES(CODIGO CHAR (1) PRIMARY KEYCHECK (CODIGO IN (‘N’)),NOMBRE CHAR (30),DIRECCION CHAR (30));

INSERT INTO SUCURSALES VALUES

Page 4: práctica de base de datos distribuidas

(‘S’, ‘SUCURSAL SUR’, ‘AV. ANTONIO JOSE DE SUCRE S-12’);

INSERT INTO SUCURSALES@SITIO2 VALUES(‘N’, ‘SUCURSAL NORTE’, ‘AV. LOS ESTADIOS’);

COMMIT;

SELECT * FROM SUCURSALESUNIONSELECT * FROM SUCURSALES@SITIO1;

TERCERA PARTE: FRACCIONAMIENTO VERTICAL.

PRODUCTOS = (CODIGOP, DESCRIPCION, STOCK, FABRICANTE, DIMENCIONES, FECHA)CP = CODIGOPD_CODIGOP = ENTERO > 0

F1_PRODUCTOS = (CODIGOP, FABRICANTE, DIMENSIONES)

F2_PRODUCTOS = (CODIGOP, DESCRIPCION, STOCK)

SITIO SRV1 (SITIO 1).

CREATE TABLE F1_PRODUCTOS(CODIGOP NUMBER PRIMARY KEYCHECK (CODIGOP > 0),FABRICANTE VARCHAR (40),DIMESIONES VARCHAR (50));

CREATE SNAPSHOT LOG ON F1_PRODUCTOS;

SITIO SRV2 (SITIO 2).

CREATE SNAPSHOT S_F1_PRODUCTOSREFRESH FASTSTART WITH SYSDATENEXT SYSDATE + 0.0001WITH PRIMARY KEYASSELECT * FROM F1_PRODUCTOS@SITIO1;

CREATE TABLE F2_PRODUCTOS(CODIGOP UNIQUE,

Page 5: práctica de base de datos distribuidas

DESCRIPCION CHAR (40),STOCK NUMBER (10, 2),CONSTRAINT FK_F1 FOREIGN KEY (CODIGOP)REFERENCES S_F1_PRODUCTOS (CODIGOP));

SITIO SRV1 (SITIO 1).

CREATE TABLE F2_PRODUCTOS(CODIGOP UNIQUE,DESCRIPCION CHAR (40),STOCK NUMBER (10, 2),CONSTRAINT FK_F1 FOREIGN KEY (CODIGOP)REFERENCES F1_PRODUCTOS (CODIGOP));

CREATE VIEW V_PRODUCTOSAS SELECT ‘S’ SITIO, F.*, DESCRIPCION, STOCKFROM F1_PRODUCTOS F, F2_PRODUCTOS;

CREATE OR REPLACE TRIGGER T_PRODUCTOSINSTEAD OF INSERT ON V_PRODUCTOSFOR EACH ROWDECLARECURSOR C1 ISSELECT 1 FROM F1_PRODUCTOSWHERE CODIGOP = :NEW.CODIGOP;X C1%ROWTYPE;BEGINOPEN C1;FETCH C1 INTO X;IF C1%ROWCOUNT = 0 THENINSERT INTO F1_PRODUCTOS (CODIGOP, FABRICANTE, DIMESIONES)VALUES(:NEW.CODIGOP, :NEW.FABRICANTE, :NEW.DIMESIONES);END IF;IF :NEW.SITIO = ‘S’ THENINSERT INTO F2_PRODUCTOS(CODIGOP, DESCRIPCION, STOCK)VALUES(:NEW.CODIGOP, :NEW.DESCRIPCION, :NEW.STOCK);ELSEINSERT INTO F2_PRODUCTOS@SITIO2(CODIGOP, DESCRIPCION, STOCK)VALUES(:NEW.CODIGOP, :NEW.DESCRIPCION, :NEW.STOCK);END IF;END;

Page 6: práctica de base de datos distribuidas

./

INSERT INTO V_PRODUCTOS VALUES(‘S’, 1, ‘XX’,’YY’,’DESCRI’, 20);

INSERT INTO V_PRODUCTOS VALUES(‘N’, 1, ‘XX’,’YY’,’DESCRI’, 10);

CUARTA PARTE: FRACCIONAMIENTO HORIZONTAL DERIVADO.

Derivado se la realiza cuando la tabla es dependiente (depende de otras)

FACTURAS = (NUMERO, FECHA, VALOR, CLIENTE, SUCURSAL)CP = NUMEROD_NUMERO = 10 Caracteres, el primero de la izquierda es la letra correspondiente al código de la sucursal donde se emite la factura, los demás caracteres dan un número > 0CF1 = CLIENTE, se refiere a CLIENTES en CEDULACF2 = SUCURSAL, se refiere a SUCURSALES en CODIGO

SITIO SRV2 (SITIO 2).

CREATE TABLE FACTURAS(NUMERO CHAR (10) PRIMARY KEYCHECK (SUBSTR (NUMERO, 1, 1) IN (‘N’)AND RTRIM (SUBSTR (NUMERO, 2, 9)) > 0),FECHA DATE,VALOR NUMBER (10, 2),CLIENTE,SUCURSAL,CONSTRAINT FK_CLI FOREIGN KEY (CLIENTE)REFERENCES S_CLIENTES (CEDULA),CONSTRAINT FK_SUC FOREIGN KEY (SUCURSAL)REFERENCES SUCURSALES (CODIGO));

SITIO SRV1 (SITIO 1).

CREATE TABLE FACTURAS(NUMERO CHAR (10) PRIMARY KEYCHECK (SUBSTR (NUMERO, 1, 1) IN (‘S’)AND RTRIM (SUBSTR (NUMERO, 2, 9)) > 0),FECHA DATE,VALOR NUMBER (10, 2),CLIENTE,SUCURSAL,

Page 7: práctica de base de datos distribuidas

CONSTRAINT FK_CLI FOREIGN KEY (CLIENTE)REFERENCES CLIENTES (CEDULA),CONSTRAINT FK_SUC FOREIGN KEY (SUCURSAL)REFERENCES SUCURSALES (CODIGO));

VENTAS = (FACTURA, CANTIDAD, PRECIO, PRODUCTO)CF3 = FACTURA, se refiere a FACTURAS en NUMEROCF4 = PRODUCTO, se refiere a PRODUCTOS en CODIGOP.

CREATE TABLE VENTAS(FACTURA,CANTIDAD NUMBER (10, 2),PRECIO NUMBER (10, 2),PRODUCTO,CONSTRAINT FK_FAC1 FOREIGN KEY (FACTURA)REFERENCES FACTURAS (NUMERO),CONSTRAINT FK_PROD1 FOREIGN KEY (PRODUCTO)REFERENCES F2_PRODUCTOS (CODIGOP));

QUINTA PARTE: INSERCION DE DATOS EN FACTURAS Y VENTAS.

CREATE VIEW TODAS_FACTURASASSELECT NUMEROFROM FACTURASUNIONSELECT NUMEROFROM FACTURAS@SITIO2;

CREATE VIEW TODAS_VENTASAS SELECT F.*, CANTIDAD, PRECIO, PRODUCTO FROM FACTURAS F, VENTASWHERE NUMERO = FACTURAUNIONSELECT F.*,CANTIDAD, PRECIO, PRODUCTO FROM FACTURAS@SITIO2 F, VENTAS@SITIO2WHERE NUMERO = FACTURA;

CREATE OR REPLACE TRIGGER T_VENTASINSTEAD OF INSERTON TODAS_VENTAS

Page 8: práctica de base de datos distribuidas

FOR EACH ROWDECLARECURSOR C1 ISSELECT 1 FROM TODAS_FACTURASWHERE NUMERO = :NEW.NUMERO;X C1%ROWTYPE;BEGINOPEN C1;FETCH C1 INTO X;IF C1%ROWCOUNT = 0 THENIF :NEW.SUCURSAL = ‘S’ THENINSERT INTO FACTURAS VALUES(:NEW.NUMERO,SYSDATE,:NEW.VALOR,:NEW.CLIENTE,:NEW.SUCURSAL);INSERT INTO VENTAS VALUES(:NEW.NUMERO, :NEW.CANTIDAD, :NEW.PRECIO, :NEW.PRODUCTO);ELSEINSERT INTO FACTURAS@SITIO2 VALUES(:NEW.NUMERO,SYSDATE,:NEW.VALOR,:NEW.CLIENTE,:NEW.SUCURSAL);INSERT INTO VENTAS@SITIO2 VALUES(:NEW.NUMERO, :NEW.CANTIDAD, :NEW.PRECIO, :NEW.PRODUCTO);END IF;ELSEIF :NEW.SUCURSAL = ‘S’ THENINSERT INTO VENTAS VALUES(:NEW.NUMERO, :NEW.CANTIDAD, :NEW.PRECIO, :NEW.PRODUCTO);ELSEINSERT INTO VENTAS@SITIO2 VALUES(:NEW.NUMERO, :NEW.CANTIDAD, :NEW.PRECIO, :NEW.PRODUCTO);END IF;END IF;END;./

INSERT INTO TODAS_VENTAS VALUES(‘S000000001’,SYSDATE, 120.35, ’1700003237’,’S’, 2, 5.23, 1);

INSERT INTO TODAS_VENTAS VALUES(‘N000000001’,SYSDATE, 120.35, ’1700003237’,’N’, 2, 5.23, 1);

Page 9: práctica de base de datos distribuidas

SEXTA PARTE: USUARIOS Y PERFILES

USUARIOSGerenteContador

BodegueroVendedores

PERFIL: GERENTECONSULTAR INSERTAR ACTUALIZAR

SUCURSALES X XCLIENTES X

PRODUCTOS X XFACTURAS X X

VENTAS X

PERFIL: CONTADORSUCURSALES X

CLIENTES XPRODUCTOS XFACTURAS X

VENTAS X

PERFIL:BODEGUEROSSUCURSALES X

CLIENTES XPRODUCTOS X X XFACTURAS X

VENTAS X

PERFIL:VENDEDORESSUCURSALES X

CLIENTES X XPRODUCTOS XFACTURAS X X

VENTAS X X

DEMANDAS TIPO:

GERENTE:

1.- Total vendido por sucursal en una fecha dada.SELECT SUM (VALOR) AS VENTAS, NOMBREFROM FACTURAS F, SUCURSALES S

Page 10: práctica de base de datos distribuidas

WHERE F.SUCURSAL = S.CODIGO AND TO_CHAR (FECHA, ‘MMDDYYYY’ = DATOGROUP BY NOMBRE;

2.- Número de clientes hasta la fecha.

CONTADOR:

1.- Número de facturas emitidas y monto por sucursal

2.- Listado de fabricantes de productos

BODEGUEROS:

1.- Stock de los productos.

2.- Ingreso y actualización de datos de productos

3.- Listado de fabricantes de los productos.

VENDEDORES:

1.- Ingreso de facturas y ventas

2.- Consulta de ventas realizadas

TRADUCCION DE LAS PREGUNTAS A SQL:

GERENTE:

1.- SELECT SUM (VALOR) AS VENTAS, NOMBREFROM FACTURAS F, SUCURSALES SWHERE F.SUCURSAL = S.CODIGO AND TO_CHAR (FECHA, ‘MMDDYYYY’ = DATOGROUP BY NOMBRE;

EQUIVALENTE EN EL SISTEMA DISTRIBUIDO:

SELECT SUM (VALOR) AS VENTAS, NOMBREFROM FACTURAS F, SUCURSALES SWHERE F.SUCURSAL = S.CODIGOAND TO_CHAR (FECHA, ‘MMYYYY’) = &DATOGROUP BY NOMBREUNIONSELECT SUM (VALOR) AS VENTAS, NOMBREFROM FACTURAS@SITIO2 F, SUCURSALES@SITIO2 S

Page 11: práctica de base de datos distribuidas

WHERE F.SUCURSAL = S.CODIGOAND TO_CHAR (FECHA, ‘MMYYYY’) = &DATOGROUP BY NOMBRE;

CREATE VIEW VENTAS_SUCURSALASSELECT SUM (VALOR) AS VENTAS, NOMBREFROM FACTURAS F, SUCURSALES SWHERE F.SUCURSAL = S.CODIGOAND TO_CHAR (FECHA, ‘MMYYYY’) = &DATOGROUP BY NOMBREUNIONSELECT SUM (VALOR) AS VENTAS, NOMBREFROM FACTURAS@SITIO2 F, SUCURSALES@SITIO2 SWHERE F.SUCURSAL = S.CODIGOAND TO_CHAR (FECHA, ‘MMYYYY’) = &DATOGROUP BY NOMBRE;

2.- SELECT COUNT(*) CLIENTESFROM CLIENTES;

CREATE VIEW TOTAL_CLIENTESAS SELECT COUNT(*) CLIENTESFROM CLIENTES;

CONTADOR:

1.- SELECT COUNT(*) AS NUMERO, SUM (VALOR) AS TOTAL, NOMBREFROM FACTURAS F, SUCURSALES SGROUP BY NOMBRE;

EQUIVALENTE EN EL SISTEMA DISTRIBUIDO:

SELECT COUNT(*) AS NUMERO, SUM (VALOR) AS TOTAL, NOMBREFROM FACTURAS F, SUCURSALES SGROUP BY NOMBREUNIONSELECT COUNT(*) AS NUMERO, SUM (VALOR) AS TOTAL, NOMBREFROM FACTURAS@SITIO2 F, SUCURSALES@SITIO2 SGROUP BY NOMBRE;

CREATE VIEW TOTAL_FACTURASASSELECT COUNT(*) AS NUMERO, SUM (VALOR) AS TOTAL, NOMBREFROM FACTURAS F, SUCURSALES SGROUP BY NOMBREUNIONSELECT COUNT(*) AS NUMERO, SUM (VALOR) AS TOTAL, NOMBRE

Page 12: práctica de base de datos distribuidas

FROM FACTURAS@SITIO2 F, SUCURSALES@SITIO2 SGROUP BY NOMBRE;

2.- SELECT DESCRIPCION, FABRICANTEFROM PRODUCTOSORDER BY DESCRIPCION;

EQUIVALENTE EN EL SISTEMA DISTRIBUIDO:

SELECT DESCRIPCION, FABRICANTEFROM F1_PRODUCTOS F1, F2_PRODUCTOS F2WHERE F1.CODIGOP = F2.CODIGOPORDER BY DESCRIPCION;

CREATE VIEW FABRICANTES ASSELECT DESCRIPCION, FABRICANTEFROM F1_PRODUCTOS F1, F2_PRODUCTOS F2WHERE F1.CODIGOP = F2.CODIGOPORDER BY DESCRIPCION;

BODEGUEROS:

1.- SELECT DESCRIPCION, STOCK, NOMBRE, 0 STOCK1, ‘ ‘ NOMBRE1FROM F2_PRODUCTOS, SUCURSALESUNION SELECT DESCRIPCION, 0 STOCK, ‘ ‘ NOMBRE, STOCK STOCK1, NOMBRE NOMBRE1FROM F2_PRODUCTOS@SITIO2, SUCURSALES@SITIO2;

CREATE TABLE T_STOCKS(CODIGOP NUMBER,DESCRIPCION CHAR (40) PRIMARY KEY,STOCK1 NUMBER (10, 2),STOCK2 NUMBER (10, 2))

CREATE OR REPLACE PROCEDURE STOCKSASCURSOR A1 ISSELECT CODIGOP, DESCRIPCION, STOCKFROM F2_PRODUCTOS;CURSOR A2 ISSELECT CODIGOP, DESCRIPCION, STOCKFROM F2_PRODUCTOS@SITIO2;X A1%ROWTYPE;BEGINDELETE T_STOCKS;COMMIT;FOR X IN A1 LOOPINSERT INTO T_STOCKS

Page 13: práctica de base de datos distribuidas

(CODIGOP, DESCRIPCION, STOCK1) VALUES(X.CODIGOP, X.DESCRIPCION, X.STOCK);END LOOP;FOR X IN A2 LOOPUPDATE T_STOCKSSET STOCK2 = X.STOCKWHERE DESCRIPCION = X.DESCRIPCION;END LOOP;COMMIT;END;./

2.- Ingreso de datos de productos.

Se utiliza la vista V_PRODUCTOS.

INSERT INTO V_PRODUCTOS VALUES(‘S’, 1, ‘XX’,’YY’,’DESCRI’, 20);

INSERT INTO V_PRODUCTOS VALUES(‘N’, 1, ‘XX’,’YY’,’DESCRI’, 10);

Actualización de stock de productos:

UPDATE F2_PRODUCTOSSET STOCK = NUEVO_STOCKWHERE CODIGOP = &DATO;

Para una sucursal remota:

UPDATE F2_PRODUCTOS@SITIO2SET STOCK = NUEVO_STOCKWHERE CODIGOP = &DATO;

BOTON ACTUALIZAR:

DECLARECODIGO NUMBER;CURSOR C1 ISSELECT 1 FROM F2_PRODUCTOSWHERE CODIGOP = :F2_PRODUCTOS.CODIGOP;X NUMBER;NO_HAY EXCEPTION;BEGIN

IF :F2_PRODUCTOS.STOCK <> 0 THEN

Page 14: práctica de base de datos distribuidas

OPEN C1;FETCH C1 INTO X;IF X <> 0 THEN

UPDATE F2_PRODUCTOSSET STOCK = :F2_PRODUCTOS.STOCKWHERE CODIGOP = :F2_PRODUCTOS.CODIGOP;COMMIT;MESSAGE ('STOCK ACTUALIZADO');

ELSERAISE NO_HAY;

END IF;END IF;EXCEPTION

WHEN NO_HAY THENRAISE FORM_TRIGGER_FAILURE;

END;

BOTON OTRO:

BEGINGO_BLOCK ('F2_PRODUCTOS');GO_ITEM ('F2_PRODUCTOS.CODIGOP');:F2_PRODUCTOS.CODIGOP := '';:F2_PRODUCTOS.DESCRIPCION := '';:F2_PRODUCTOS.STOCK := '';END;

BOTON SALIR:

BEGINCLOSE_FORM('MODULE1');END;

ITEM CODIGOP WHEN_VALIDATE_ITEM:

DECLARENO_HAY EXCEPTION;X NUMBER;BEGIN

SELECT COUNT(*)INTO XFROM F2_PRODUCTOSWHERE CODIGOP = :F2_PRODUCTOS.CODIGOP;IF X <> 0 THENSELECT DESCRIPCION, STOCK INTO:F2_PRODUCTOS.DESCRIPCION, :F2_PRODUCTOS.STOCKFROM F2_PRODUCTOSWHERE CODIGOP = :F2_PRODUCTOS.CODIGOP;ELSE

MESSAGE ('NO HAY ESTE PRODUCTO');GO_BLOCK ('BOTONES');

Page 15: práctica de base de datos distribuidas

END IF;EXCEPTION

WHEN NO_HAY THENGO_BLOCK ('BOTONES');

WHEN OTHERS THENRAISE FORM_TRIGGER_FAILURE;

GO_BLOCK ('BOTONES');END;

VENDEDORES.

FORMULARIO PARA INGRESO DE FACTURAS Y VENTAS

-- FACTURAS WHEN-NEW-BLOCK-INSTANCE

BEGINSELECT SYSDATE INTO :FACTURAS.FECHAFROM DUAL;END;

/* POST-TEXT-ITEM EN VENTAS.PRODUCTO */

DECLAREK INTEGER;CURSOR C1 ISSELECT 1 FROM F2_PRODUCTOSWHERE CODIGOP = :VENTAS.PRODUCTO;NOEXISTE EXCEPTION;

BEGINOPEN C1;FETCH C1 INTO K;IF K IS NOT NULL THEN

SELECT DESCRIPCION INTO :VENTAS.DESCRIPCION FROM F2_PRODUCTOSWHERE CODIGOP = :VENTAS.PRODUCTO;:GLOBAL.SI := 'S';

ELSE -- MESSAGE ('DEBE INGRESAR UN CODIGO');

:GLOBAL.SI := '';END IF;CLOSE C1;IF :GLOBAL.SI IS NULL

AND :VENTAS.PRODUCTO IS NOT NULL THEN:VENTAS.PRODUCTO := '';RAISE NOEXISTE;

END IF;

Page 16: práctica de base de datos distribuidas

EXCEPTIONWHEN NOEXISTE THEN

MESSAGE ('ESTE PRODUCTO NO EXISTE, VERIFIQUE');RAISE FORM_TRIGGER_FAILURE;

END;

-- BOTON ACEPTAR WHEN-BUTTON-PRESSED

DECLAREK INTEGER := 0;NCOMPROB CHAR (10);MORDINAL INTEGER;SINNUMERO EXCEPTION;FALTANDATOS EXCEPTION;

BEGINIF :FACTURAS.NUMERO IS NOT NULL THEN

NCOMPROB := RTRIM(:FACTURAS.SUCURSAL) || RTRIM(:FACTURAS.NUMERO);

ELSEK := 1;RAISE SINNUMERO;

END IF;IF :FACTURAS.FECHA IS NULL THEN

:FACTURAS.FECHA := SYSDATE;END IF;IF K = 0 THEN

GO_BLOCK ('VENTAS');FIRST_RECORD;MORDINAL := 1;WHILE :VENTAS.PRODUCTO IS NOT NULL LOOP

IF :VENTAS.PRECIO IS NULL OR :VENTAS.CANTIDAD IS NULL THEN

MESSAGE ('FALTAN VALORES REVISE');RAISE FALTANDATOS;

END IF;

/*NUMERO

FECHA VALOR CLIENTE SUCURSAL CANTIDAD PRECIO PRODUCTO */

INSERT INTO TODAS_VENTAS

Page 17: práctica de base de datos distribuidas

(NUMERO,

FECHA ,VALOR ,CLIENTE ,SUCURSAL ,CANTIDAD ,PRECIO ,PRODUCTO)VALUES(

NCOMPROB, :FACTURAS.FECHA , :FACTURAS.VALOR , :FACTURAS.CLIENTE , RTRIM(:FACTURAS.SUCURSAL) , :VENTAS.CANTIDAD , :VENTAS.PRECIO , :VENTAS.PRODUCTO );

NEXT_RECORD;MORDINAL := MORDINAL + 1;

END LOOP; COMMIT;

ELSE-- MESSAGE ('OTROS ERRORES, VERIFIQUE');

RAISE FORM_TRIGGER_FAILURE;END IF;EXCEPTION

WHEN SINNUMERO THENMESSAGE ('FALTA NUMERO DE COMPROBANTE');GO_BLOCK ('FACTURAS');GO_ITEM ('FACTURAS.NUMERO');RAISE FORM_TRIGGER_FAILURE;

WHEN FALTANDATOS THENMESSAGE ('FALTAN DATOS');GO_BLOCK ('VENTAS');GO_ITEM ('VENTAS.PRODUCTO');

RAISE FORM_TRIGGER_FAILURE;WHEN OTHERS THEN

MESSAGE ('HAY ERRORES');RAISE FORM_TRIGGER_FAILURE;

END;

-- BOTON SALIR WHEN-BUTTON-PRESED

EXIT_FORM;

Page 18: práctica de base de datos distribuidas

SÉPTIMA PARTE.

REPLICACION BIDIRECCIONAL.

SITIO SRV1 (SITIO 1).

CREATE TABLE PROMOCIONES(CODIGOP NUMBER PRIMARY KEY,DESCRIPCION CHAR (40),STOCK NUMBER (10, 2),FECHAINICIAL DATE,FECHAFINAL DATE);

SITIO SRV2 (SITIO 2).

CREATE TABLE PROMOCIONES(CODIGOP NUMBER PRIMARY KEY,DESCRIPCION CHAR (40),STOCK NUMBER (10, 2),FECHAINICIAL DATE,FECHAFINAL DATE);

SITIO SRV1 (SITIO 1).

CREATE OR REPLACE TRIGGER T_PROMOCIONESAFTER INSERT ON PROMOCIONESFOR EACH ROWDECLARECURSOR C1 ISSELECT 1 FROM PROMOCIONES@SITIO2WHERE CODIGOP = :NEW.CODIGOP;X C1%ROWTYPE;BEGINOPEN C1;FETCH C1 INTO X;IF C1%NOTFOUND THENINSERT INTO PROMOCIONES@SITIO2VALUES(:NEW.CODIGOP, :NEW.DESCRIPCION, :NEW.STOCK,:NEW.FECHAINICIAL, :NEW.FECHAFINAL);CLOSE C1;END IF;END;./

INSERT INTO PROMOCIONES VALUES(1, ‘DESCRI’,27,SYSDATE + 10, SYSDATE +20);

Page 19: práctica de base de datos distribuidas

SITIO SRV2 (SITIO 2).

CREATE OR REPLACE TRIGGER T_PROMOCIONESAFTER INSERT ON PROMOCIONESFOR EACH ROWDECLARECURSOR C1 ISSELECT 1 FROM PROMOCIONES@SITIO1WHERE CODIGOP = :NEW.CODIGOP;X C1%ROWTYPE;BEGINOPEN C1;FETCH C1 INTO X;IF C1%NOTFOUND THENINSERT INTO PROMOCIONES@SITIO1VALUES(:NEW.CODIGOP, :NEW.DESCRIPCION, :NEW.STOCK,:NEW.FECHAINICIAL, :NEW.FECHAFINAL);CLOSE C1;END IF;END;./

INSERT INTO PROMOCIONES VALUES(2, ‘DESCRI’,27,SYSDATE + 10, SYSDATE +20);