-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathejercicio2.txt
79 lines (60 loc) · 2.53 KB
/
ejercicio2.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
CREATE TABLE sucursal(
cods VARCHAR2(500) PRIMARY KEY,
nrosucdependientes NUMBER(1) NOT NULL CHECK (nrosucdependientes BETWEEN 0 AND 9)
);
CREATE OR REPLACE TRIGGER control_insercion
FOR INSERT ON sucursal
COMPOUND TRIGGER
TYPE inserciones_sucursal IS TABLE OF sucursal%ROWTYPE INDEX BY SIMPLE_INTEGER;
instancia_inserciones_sucursal inserciones_sucursal;
indice SIMPLE_INTEGER := 0;
BEFORE EACH ROW IS
BEGIN
FOR indice_sucursal IN 1 .. :NEW.nrosucdependientes
LOOP
indice := indice + 1;
instancia_inserciones_sucursal(indice).cods := :NEW.cods || '.' || indice_sucursal;
instancia_inserciones_sucursal(indice).nrosucdependientes := 0;
END LOOP;
END BEFORE EACH ROW;
AFTER STATEMENT IS
BEGIN
FORALL indice_tabla IN 1..instancia_inserciones_sucursal.count()
INSERT INTO sucursal VALUES instancia_inserciones_sucursal(indice_tabla);
END AFTER STATEMENT;
END control_insercion;
/
CREATE OR REPLACE TRIGGER control_actualizado
FOR UPDATE ON sucursal
COMPOUND TRIGGER
TYPE inserciones_sucursal IS TABLE OF sucursal%ROWTYPE INDEX BY SIMPLE_INTEGER;
instancia_inserciones_sucursal inserciones_sucursal;
instancia_borrados_sucursal inserciones_sucursal;
indice_inserciones_sucursal SIMPLE_INTEGER := 0;
indice_borrados_sucursal SIMPLE_INTEGER := 0;
BEFORE EACH ROW IS
BEGIN
IF :OLD.nrosucdependientes > :NEW.nrosucdependientes THEN
indice_borrados_sucursal := indice_borrados_sucursal + 1;
instancia_borrados_sucursal(indice_borrados_sucursal).cods := :OLD.cods;
instancia_borrados_sucursal(indice_borrados_sucursal).nrosucdependientes := :NEW.nrosucdependientes;
ELSIF :OLD.nrosucdependientes < :NEW.nrosucdependientes THEN
FOR indice_sucursal IN :OLD.nrosucdependientes + 1 .. :NEW.nrosucdependientes
LOOP
indice_inserciones_sucursal := indice_inserciones_sucursal + 1;
instancia_inserciones_sucursal(indice_inserciones_sucursal).cods := :OLD.cods || '.' || indice_sucursal;
instancia_inserciones_sucursal(indice_inserciones_sucursal).nrosucdependientes := 0;
END LOOP;
END IF;
END BEFORE EACH ROW;
AFTER STATEMENT IS
BEGIN
FORALL indice_borrado IN 1..instancia_borrados_sucursal.count()
DELETE FROM sucursal
WHERE cods LIKE instancia_borrados_sucursal(indice_borrado).cods || '.%'
AND cods >= instancia_borrados_sucursal(indice_borrado).cods || '.' || (instancia_borrados_sucursal(indice_borrado).nrosucdependientes + 1);
FORALL indice_actualizado IN 1..instancia_inserciones_sucursal.count()
INSERT INTO sucursal VALUES instancia_inserciones_sucursal(indice_actualizado);
END AFTER STATEMENT;
END control_actualizado;
/