Sei sulla pagina 1di 4

Carrera CIENCIAS INFORMÁTICAS Asignatura: BASE DE DATOS 2 FECHA Tema 1 25

Examen PRIMER FINAL Sección (Marcar) NA NB NC 09/01/2019 Tema 2 20


NA, NC: Marco Leiva Alumno (Completar los datos) Tema 3 35
Profesores Jorge B. /Héctor G. Tema 4 20
NB: Carmen Martínez W. Cédula
Delia H. Nombre TOTAL 100

El modelo representa un esquema simplificado del Presupuesto Nacional. Se asume que sólo figuran datos del año en
curso.
TEMA 1: Objeto 1) 4P, 2) Especif: 5P, Body: 2.a 5P 2.b 6P 2.c 5P
Cree en la base de datos los siguientes elementos:
1) El tipo de datos TAB_PRESUP como un VARRAY de números con 12 ocurrencias
2) El tipo de datos T_PRESUP como un objeto con los siguientes elementos:
- PRESUPUESTO TAB_PRESUP
Y los siguientes métodos
a) La función miembro OBTENER_VALOR_MES que recibe como parámetro un número n, siendo n un valor de 1 a
12 correspondiente a uno de los meses del año. La función devuelve el valor del presupuesto correspondiente a dicho
mes “n”.
b) La función miembro OBTENER_SUMATORIA_MES que recibe como parámetro un número n, siendo n un valor de
1 a 12 correspondiente a uno de los meses del año. La función devuelve la sumatoria del presupuesto correspondiente
a los meses 1 a n.
c) El procedimiento miembro SUMAR_VALOR_MES que recibe como parámetros dos números: El primer parámetro
es un número n que corresponde al mes del año (su valor debe ser de 1 a 12), y el segundo parámetro es un valor que
se sumará a la enésima ocurrencia
CREATE TYPE TAB_PRESUP IS VARRAY(12) OF NUMBER;
/
CREATE OR REPLACE TYPE T_PRESUP IS OBJECT
(PRESUPUESTO TAB_PRESUP,
MEMBER FUNCTION OBTENER_VALOR_MES(PMES NUMBER) RETURN NUMBER,
MEMBER FUNCTION OBTENER_SUMATORIA_MES(PMES NUMBER) RETURN NUMBER,
MEMBER PROCEDURE SUMAR_VALOR_MES(PMES NUMBER, PVALOR NUMBER));
/
CREATE OR REPLACE TYPE BODY T_PRESUP IS
MEMBER FUNCTION OBTENER_VALOR_MES(PMES NUMBER) RETURN NUMBER IS
BEGIN
IF PMES BETWEEN 1 AND 12 THEN
RETURN SELF.PRESUPUESTO(PMES);
ELSE
RAISE_APPLICATION_ERROR(-20001, 'Valor debe ser de 1 a 12');
END IF;
END;
MEMBER FUNCTION OBTENER_SUMATORIA_MES(PMES NUMBER) RETURN NUMBER IS
V_MONTO NUMBER := 0;
BEGIN
IF PMES BETWEEN 1 AND 12 THEN
FOR I IN 1..PMES LOOP
V_MONTO := V_MONTO + SELF.PRESUPUESTO(I);
END LOOP;
RETURN V_MONTO;
ELSE
RAISE_APPLICATION_ERROR(-20001, 'Valor debe ser de 1 a 12');
END IF;
END;
MEMBER PROCEDURE SUMAR_VALOR_MES(PMES NUMBER, PVALOR NUMBER) IS
BEGIN
IF PMES BETWEEN 1 AND 12 THEN
SELF.PRESUPUESTO(PMES) := NVL(SELF.PRESUPUESTO(PMES),0) + PVALOR;
ELSE
RAISE_APPLICATION_ERROR(-20001, 'Valor debe ser de 1 a 12');
END IF;
END;
END;
/

TEMA 2: SQL Dinámico (20P)


3) Cree un PL/SQL anónimo que deberá recorrer todas las tablas de su esquema que tengan el prefijo “PRE_”, y alterarlas
agregando dos columnas: PLANIFICADO y EJECUTADO del tipo T_PRESUP.
Carrera CIENCIAS INFORMÁTICAS Asignatura: BASE DE DATOS 2 FECHA Tema 1 25
Examen PRIMER FINAL Sección (Marcar) NA NB NC 09/01/2019 Tema 2 20
NA, NC: Marco Leiva Alumno (Completar los datos) Tema 3 35
Profesores Jorge B. /Héctor G. Tema 4 20
NB: Carmen Martínez W. Cédula
Delia H. Nombre TOTAL 100

Una vez finalizado, ejecute el procedimiento. Las tablas deberán quedar alteradas. Este es un requisito para continuar con
los siguientes temas.
DECLARE
CURSOR C_TAB IS
SELECT TABLE_NAME FROM USER_TABLES
WHERE TABLE_NAME LIKE 'PRE\_%' ESCAPE '\';
BEGIN
FOR REG IN C_TAB LOOP
EXECUTE IMMEDIATE 'ALTER TABLE '|| REG.TABLE_NAME ||
' ADD (PLANIFICADO T_PRESUP,
EJECUTADO T_PRESUP)';
END LOOP;
END;
/

TEMA 3: Trigger : Sintaxis correcta y control de tabla mutante: 9P, y 6,5P por cada control.
A través de disparadores, establezca los siguientes controles en la BD (cuando sea posible, aplique los métodos del objeto):
4) Sobre la tabla PRE_GASTOS deberá controlar al INSERTAR y MODIFICAR sólo cuando el tipo sea igual a ‘G’
(gastos):
a) La suma del atributo PLANIFICADO, hasta el mes del sistema, de todos los rubros de gastos incluido el que se está
insertando, no debe sobrepasar la suma del atributo PLANIFICADO de ingresos correspondiente a dicha entidad.
b) Si el ORIGEN_FINANCIAMIENTO corresponde a ‘FONACIDE’, el gasto sólo puede ser de capital
c) Sólo al insertar: Todos los meses del atributo EJECUTADO deberán ser inicializados en 0
d) Sólo al modificar: La sumatoria de EJECUTADO (hasta el mes) no debe sobrepasar el PRESUPUESTADO (hasta el
mes).
Prevenga el peligro de un error por tabla mutante.

CREATE OR REPLACE TRIGGER BIU_PRE_GASTOS


FOR INSERT OR UPDATE ON PRE_GASTOS
COMPOUND TRIGGER
TYPE T_TAB IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
V_ING T_TAB;
V_GAS T_TAB;
V_NOMBRE VARCHAR2(30);
CURSOR C_ING IS
SELECT COD_ENTIDAD, SUM(I.PLANIFICADO.OBTENER_SUMATORIA_MES(EXTRACT(MONTH FROM
SYSDATE))) MONTO
FROM PRE_INGRESOS I
GROUP BY COD_ENTIDAD;
CURSOR C_GAS IS
SELECT COD_ENTIDAD, SUM(G.PLANIFICADO.OBTENER_SUMATORIA_MES(EXTRACT(MONTH FROM
SYSDATE))) MONTO
FROM PRE_GASTOS G
GROUP BY COD_ENTIDAD;
BEFORE STATEMENT IS
BEGIN
V_ING.DELETE;
V_GAS.DELETE;
FOR REG IN C_ING LOOP
V_ING(REG.COD_ENTIDAD) := REG.MONTO;
END LOOP;
FOR REG IN C_GAS LOOP
V_GAS(REG.COD_ENTIDAD) := REG.MONTO;
END LOOP;
END BEFORE STATEMENT;
BEFORE EACH ROW IS
BEGIN
-- a) Considera el valor del rubro que se actualiza o inserta en ese momento
IF UPDATING THEN
V_GAS(:OLD.COD_ENTIDAD):= V_GAS(:OLD.COD_ENTIDAD) -
:OLD.PLANIFICADO.OBTENER_SUMATORIA_MES(EXTRACT(MONTH FROM SYSDATE));
Carrera CIENCIAS INFORMÁTICAS Asignatura: BASE DE DATOS 2 FECHA Tema 1 25
Examen PRIMER FINAL Sección (Marcar) NA NB NC 09/01/2019 Tema 2 20
NA, NC: Marco Leiva Alumno (Completar los datos) Tema 3 35
Profesores Jorge B. /Héctor G. Tema 4 20
NB: Carmen Martínez W. Cédula
Delia H. Nombre TOTAL 100

END IF;
V_GAS(:NEW.COD_ENTIDAD):= NVL(V_GAS(:NEW.COD_ENTIDAD),0) +
:NEW.PLANIFICADO.OBTENER_SUMATORIA_MES(EXTRACT(MONTH FROM SYSDATE));
IF V_GAS(:NEW.COD_ENTIDAD) > NVL(V_ING(:NEW.COD_ENTIDAD),0) THEN
RAISE_APPLICATION_ERROR(-20003,'Gastos sobrepasa ingresos para la
entidad!');
END IF;
-- b) Control FONACIDE
SELECT NOMBRE_ORIGEN INTO V_NOMBRE
FROM ORIGEN_FINANCIAMIENTO
WHERE COD_ORIGEN = :NEW.COD_ORIGEN;
IF V_NOMBRE = 'FONACIDE' AND :NEW.TIPO_GASTO <> 'CAP' THEN
RAISE_APPLICATION_ERROR(-20004,'FONACIDE SOLO FINANCIA GASTOS DE
CAPITAL');
END IF;
-- c) Inicializacion
IF INSERTING THEN
:NEW.EJECUTADO.PRESUPUESTO := TAB_PRESUP();
FOR I IN 1..12 LOOP
:NEW.EJECUTADO.PRESUPUESTO.EXTEND;
:NEW.EJECUTADO.PRESUPUESTO(I):= 0;
END LOOP;
END IF;
-- d) Ejecutado vs planificado
IF UPDATING THEN
IF :NEW.EJECUTADO.OBTENER_SUMATORIA_MES(EXTRACT (MONTH FROM SYSDATE)) >
:NEW.PLANIFICADO.OBTENER_SUMATORIA_MES(EXTRACT (MONTH FROM SYSDATE))
THEN
RAISE_APPLICATION_ERROR(-20004,'FONACIDE SOLO FINANCIA GASTOS DE
CAPITAL');
END IF;
END IF;
END BEFORE EACH ROW;
END;
/

TEMA 4: VISTA: Sintaxis de la vista 5P, SQL 15P

Cree la vista materializada V_FONACIDE que contenga los siguientes elementos correspondiente a la rendición de cuentas
de FONACIDE (ver ejemplo): La vista se refrescará el último día de cada mes a las 4:00 am.
Entida Rubro Presupuestado(*) Ejecutado(*) Product Unid. Planif. Producto (*) Ejec. Indicado
d o Medida Producto( *) r (**)
Nombre Nombr ∑1..n ∑1..n Nombre Nombre ∑1..n ∑1..n Rojo,
Entidad e rubro (PRESUPUESTADO (EJECUTADO producto U. de (PRESUPUESTAD (EJECUTADO Amarillo
gasto ) de la tabla de gastos ) de la tabla de Medida O) de la tabla de ) de la tabla de o Verde
gastos productos productos

Ejemplo

(*) n es el mes actual. La sumatoria del presupuestado y ejecutado hasta el mes n se obtiene a través del método del objeto.
(*) Indicador: Se base en el porcentaje del producto ejecutado sobre el planificado hasta el mes n:
 Indicador <= 65  ROJO
 65 < Indicador < 90  AMARILLO
 Indicador >= 90  VERDE

CREATE MATERIALIZED VIEW V_FONACIDE


REFRESH START WITH SYSDATE NEXT LAST_DAY(TRUNC(SYSDATE))+ 4/24
Carrera CIENCIAS INFORMÁTICAS Asignatura: BASE DE DATOS 2 FECHA Tema 1 25
Examen PRIMER FINAL Sección (Marcar) NA NB NC 09/01/2019 Tema 2 20
NA, NC: Marco Leiva Alumno (Completar los datos) Tema 3 35
Profesores Jorge B. /Héctor G. Tema 4 20
NB: Carmen Martínez W. Cédula
Delia H. Nombre TOTAL 100

AS
WITH PROD AS
(SELECT D.COD_ENTIDAD, D.COD_RUBRO_G, D.COD_PRODUCTO, D.COD_UNIDAD,
D.NOMBRE_PRODUCTO,
D.PLANIFICADO.OBTENER_SUMATORIA_MES(EXTRACT (MONTH FROM SYSDATE)) PLANIF_PRO,
D.EJECUTADO.OBTENER_SUMATORIA_MES(EXTRACT (MONTH FROM SYSDATE)) EJEC_PRO
FROM PRE_PRODUCTOS D)
SELECT E.NOMBRE ENTIDAD, G.NOMBRE_RUBRO,
G.PLANIFICADO.OBTENER_SUMATORIA_MES(EXTRACT (MONTH FROM SYSDATE))
PLANIFICADO,
G.EJECUTADO.OBTENER_SUMATORIA_MES(EXTRACT (MONTH FROM SYSDATE)) EJECUTADO,
P.NOMBRE_PRODUCTO, U.NOMBRE_UNIDAD, P.PLANIF_PRO, P.EJEC_PRO,
CASE
WHEN ROUND((P.EJEC_PRO/P.PLANIF_PRO)*100,0) <= 65 THEN 'ROJO'
WHEN ROUND((P.EJEC_PRO/P.PLANIF_PRO)*100,0) > 65 AND
ROUND((P.EJEC_PRO/P.PLANIF_PRO)*100,0) < 90 THEN 'AMARILLO'
WHEN ROUND((P.EJEC_PRO/P.PLANIF_PRO)*100,0) > 90 THEN 'VERDE'
END INDICADOR
FROM PROD P JOIN PRE_GASTOS G
ON G.COD_ENTIDAD = P.COD_ENTIDAD
AND G.COD_RUBRO_G = P.COD_RUBRO_G
JOIN UNIDAD_MEDIDA U
ON U.COD_UNIDAD = P.COD_UNIDAD
JOIN ENTIDADES E
ON G.COD_ENTIDAD = E.COD_ENTIDAD
WHERE G.COD_ORIGEN = (SELECT COD_ORIGEN FROM ORIGEN_FINANCIAMIENTO WHERE
UPPER(NOMBRE_ORIGEN) = 'FONACIDE');

Potrebbero piacerti anche