Sei sulla pagina 1di 5

Carrera

Examen
Profesor
Auxiliar:

ANLISIS DE SISTEMAS
2do. Final
Carmen N. Martnez W.
Lilian Riveros

Asignatura:
Seccin
Nombre Alumno

BASE DE DATOS II
J

FECHA
17-Dic-2011
PUNTAJE

Tema 1
Tema 2
Tema 3
Tema 4 (opcional)
TOTAL

Tema 1: (50 P): Especificacin:10P, Procedimientos 20 P c/u


Cree el objeto T_CREDITOS conformado de la siguiente manera:
Los siguientes atributos:
ID
number(8)
Fecha_Credito
date
Tasa
number(2)
Plazo
number(2)
Numero_cuotas
number(3)
Monto
number(15)
CUOTAS_PRESTAMO
T_CUOTAS
En donde T_CUOTAS es una TABLA anidada compuesta de los siguientes elementos:
Nro_cuota
number(2)
Capital
number(15)
Interes
number(15)
Monto_cuota
number(15)
Fecha_vencimiento
date
Y los siguientes mtodos
El procedimiento P_INSTANCIAR_CUOTAS, que acta sobre el objeto (SELF) realizando lo siguiente:

Calcula el monto de cada cuota con el mtodo francs: Monto_credito * ((tasa/100) * (1+(tasa/100))plazo /
(1+(tasa/100))plazo - 1)

Asignar las cuotas (las ocurrencias) del atributo CUOTAS_PRESTAMO, haciendo que: Capital = Saldo
capital * tasa/100 , Inters= MontoCuota Capital, Fecha= Calcular vencimientos mensuales a partir de la
fecha del crdito

Por cada cuota generada, inserta adems en la tabla de Base de Datos CUOTAS.
El procedimiento esttico P_CALCULAR_MORA que recibe como parmetro el ID de un crdito y realiza el
clculo de la mora en las cuotas VENCIDAS y no pagas (FECHA_PAGO nula), de la siguiente manera:

Obtiene la Tasa de Mora que corresponde al crdito de acuerdo a su Tipo

Recorre las cuotas, y por cada cuota vencida, calcula y ACTUALIZA la mora considerando MORA = Cuota *
(porcentaje de mora diaria) * das de mora (con respecto a la fecha de hoy). La actualizacin es en la BD
Observacin: La potencia a la n (x n) se calcula con la funcin incorporada de ORACLE POWER: As POWER (2,3) = 8
CREATE TYPE T_DET_CUOTAS AS OBJECT
(NRO_CUOTA NUMBER (2),
CAPITAL NUMBER(15),
INTERES NUMBER(15),
MONTO_CUOTA NUMBER(15),
FECHA_VENCIMIENTO DATE)
/
CREATE TYPE T_CUOTAS IS TABLE OF T_DET_CUOTAS;
/

50
25
25
100

Carrera
Examen
Profesor
Auxiliar:

ANLISIS DE SISTEMAS
2do. Final
Carmen N. Martnez W.
Lilian Riveros

Asignatura:
Seccin
Nombre Alumno

BASE DE DATOS II
J

FECHA
17-Dic-2011
PUNTAJE

Tema 1
Tema 2
Tema 3
Tema 4 (opcional)
TOTAL

CREATE OR REPLACE TYPE T_CREDITOS AS OBJECT


(ID
NUMBER(8),
FECHA_CREDITO DATE,
TASA NUMBER(2),
PLAZO NUMBER(2),
NRO_CUOTAS NUMBER(3),
MONTO NUMBER(15),
CUOTAS_PRESTAMO T_CUOTAS,
MEMBER PROCEDURE P_INSTANCIAR_CUOTAS,
STATIC PROCEDURE P_CALCULAR_MORA(PID NUMBER));
/
CREATE OR REPLACE TYPE BODY T_CREDITOS AS
MEMBER PROCEDURE P_INSTANCIAR_CUOTAS IS
V_MONTO_CUOTA NUMBER(15);
V_SALDO_CAPITAL NUMBER(15);
V_CAPITAL NUMBER(15);
V_CUOTA
NUMBER(15);
V_INTERES NUMBER(15);
V_FECHA
DATE := SELF.FECHA_CREDITO;
V_CUO_PRE T_CUOTAS := T_CUOTAS();
BEGIN
V_MONTO_CUOTA := SELF.MONTO * ((SELF.TASA/100) *
POWER((SELF.TASA/100+1), SELF.PLAZO)) /
(POWER((SELF.TASA/100+1), SELF.PLAZO)-1);
V_SALDO_CAPITAL := SELF.MONTO;
FOR IND IN 1..SELF.NRO_CUOTAS LOOP
V_CAPITAL := V_SALDO_CAPITAL *(SELF.TASA/100);
V_INTERES := V_MONTO_CUOTA V_CAPITAL;
V_FECHA
:= ADD_MONTHS(V_FECHA,1);
V_CUO_PRE.EXTEND;
V_CUO_PRE(IND) := T_DET_CUOTAS(IND, V_CAPITAL, V_INTERES,
V_MONTO_CUOTA, V_FECHA);
V_SALDO_CAPITAL := V_SALDO_CAPITAL V_CAPITAL;
INSERT INTO CUOTAS (ID_CREDITO, NRO_CUOTA, MONTO_CAPITAL,
MONTO_INTERES, MONTO_CUOTA, FECHA_VENCIMIENTO) VALUES
(SELF.ID, IND, V_CAPITAL, V_INTERES, V_MONTO_CUOTA,
V_FECHA);
END LOOP;
COMMIT;
SELF.CUOTAS_PRESTAMO := V_CUO_PRE;
END;
STATIC PROCEDURE P_CALCULAR_MORA(PID NUMBER) IS
V_TASA_MORA NUMBER(6,3);
V_MORA NUMBER(15);
CURSOR C_CUOTA
IS SELECT * FROM CUOTAS
WHERE ID_CREDITO = PID
AND
FECHA_PAGO IS NULL
AND
FECHA_VENCIMIENTO < SYSDATE
FOR
UPDATE;
BEGIN
BEGIN
SELECT ROUND(TASA_MORA_DIARIA/100,0) INTO V_TASA_MORA
FROM TIPO_CREDITO T, CREDITOS C
WHERE C.ID_TIPO_CREDITO = T.ID
AND C.ID = PID;
EXCEPTION
WHEN NO_DATA_FOUND THEN
V_TASA_MORA := 0;
END;
FOR REG IN C_CUOTA LOOP
UPDATE CUOTAS SET MORA_CALCULADA = MONTO_CUOTA * V_TASA_MORA * ROUND
(SYSDATE-REG.FECHA_VENCIMIENTO, 0)
WHERE CURRENT OF C_CUOTA;

50
25
25
100

Carrera
Examen
Profesor
Auxiliar:

ANLISIS DE SISTEMAS
2do. Final
Carmen N. Martnez W.
Lilian Riveros

Asignatura:
Seccin
Nombre Alumno

BASE DE DATOS II
J

FECHA
17-Dic-2011
PUNTAJE

Tema 1
Tema 2
Tema 3
Tema 4 (opcional)
TOTAL

END LOOP;
COMMIT;
END;
END;

Tema 2: (25P)
Cree el o los triggers necesarios sobre la tabla CREDITOS que
No permita INSERTAR un crdito si no se cumple lo siguiente:
Los ingresos totales los gastos totales deben superar en al menos 50% la Cuota Promedio [cuota promedio = (Monto
+ monto * tasa calculada) /plazo_meses]
La suma de la totalidad de sus bienes (inmuebles y rodados) deber superar en al menos 20% al monto del prstamo.
La tasa del prstamo no puede variar ms all del 10% con respecto a la tasa de referencia.
Cuando se actualiza el ESTADO a C (cancelado), se verifica que todas las cuotas tengan fecha de

pago. De no ser as, deber evitar la actualizacin.

CREATE OR REPLACE TRIGGER T_IU_CREDITOS


BEFORE INSERT OR UPDATE OF ESTADO
ON CREDITOS
FOR EACH ROW
DECLARE
V_INGRESOS
NUMBER(15);
V_GASTOS
NUMBER(15);
V_CUOTA_PROMEDIO
NUMBER(15);
V_BIENES
NUMBER(15);
V_TASA
NUMBER(2);
V_CUOTAS
NUMBER(3);
BEGIN
IF INSERTING THEN
-Calcula los ingresos totales
BEGIN
SELECT SUM(DECODE(INGRESO_GASTO,'I',MONTO,0)),
SUM(DECODE(INGRESO_GASTO,'G',MONTO,0))
INTO
V_INGRESOS, V_GASTOS
FROM
INGRESOS_GASTOS
WHERE
ID_SOCIO = :NEW.ID_SOCIO;
EXCEPTION
WHEN
OTHERS THEN
RAISE_APPLICATION_ERROR(-20000,'Error al
recuperar ingresos');
END;
V_CUOTA_PROMEDIO := ROUND(:NEW.MONTO *
(:NEW.TASA/100)/:NEW.PLAZO_MESES,0);
IF (V_INGRESOS-V_GASTOS) < (V_CUOTA_PROMEDIO * 1.5) THEN
RAISE_APPLICATION_ERROR(-20000,'Ingresos no son
suficientes');
END IF;
--

Verifica los bienes


BEGIN
SELECT SUM(B.VALOR) INTO V_BIENES
FROM (SELECT ID_SOCIO, MONTO_VALOR_FISCAL VALOR
FROM INMUEBLES
WHERE ID_SOCIO = :NEW.ID_SOCIO
UNION
SELECT ID_SOCIO, VALOR
FROM RODADOS
WHERE ID_SOCIO = :NEW.ID_SOCIO) B;
EXCEPTION
WHEN
OTHERS THEN
RAISE_APPLICATION_ERROR(-20000,'Error al
recuperar inmuebles');
END;
IF V_BIENES < (:NEW.MONTO * 1.20) THEN
RAISE_APPLICATION_ERROR(-20000,'Los inmuebles
deben superar al prstamo');

50
25
25
100

Carrera
Examen
Profesor
Auxiliar:

ANLISIS DE SISTEMAS
2do. Final
Carmen N. Martnez W.
Lilian Riveros

Asignatura:
Seccin
Nombre Alumno

BASE DE DATOS II
J

FECHA
17-Dic-2011
PUNTAJE

Tema 1
Tema 2
Tema 3
Tema 4 (opcional)
TOTAL

END IF;
Verifica tasa
BEGIN
SELECT TASA_REFERENCIA INTO V_TASA
FROM
TIPO_CREDITO
WHERE ID = :NEW.ID_TIPO_CREDITO;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20000,'Error al recuperar tasa');
END;
IF (:NEW.TASA > V_TASA *(1.10)) OR (:NEW.TASA < V_TASA * (0.9)) THEN
RAISE_APPLICATION_ERROR(-20000,'Tasa no est en el rango de referencia');
END IF;
ELSIF
UPDATING THEN
IF :NEW.ESTADO = 'P' THEN
SELECT COUNT(NRO_CUOTA) INTO V_CUOTAS
FROM CUOTAS
WHERE ID_CREDITO = :NEW.ID
AND
FECHA_PAGO IS NULL;
END IF;
IF V_CUOTAS > 0 THEN
RAISE_APPLICATION_ERROR(-20000,'Aun no se pagaron todas las cuotas');
END IF;
END IF;

--

END;

Tema 3: (25P)
Por la reconversin monetaria, todos los campos MONTO% y TASA% debern tener posiciones decimales. Cree un
procedimiento que verifique todas las tablas que tengan columnas denominadas de esta manera. El procedimiento deber recorrer
dinmicamente estas tablas y deber alterar dinmicamente dichas columnas agregndole a la precisin 2 posiciones decimales.
Deber adems determinar que esos campos tengan valor por default 0.
DECLARE
CURSOR C_COLUMN IS
SELECT TABLE_NAME, COLUMN_NAME, DATA_PRECISION
FROM
USER_TAB_COLUMNS
WHERE (COLUMN_NAME LIKE 'TASA%' OR
COLUMN_NAME LIKE 'MONTO%');
V_SENTENCIA VARCHAR2(1000);
BEGIN
FOR REG IN C_COLUMN LOOP
V_SENTENCIA := 'ALTER TABLE '|| REG.TABLE_NAME|| ' MODIFY '||
REG.COLUMN_NAME || '
NUMBER('|| REG.DATA_PRECISION || ',2) DEFAULT 0';
DBMS_OUTPUT.PUT_LINE(V_SENTENCIA);
EXECUTE IMMEDIATE V_SENTENCIA;
END LOOP;
END;

Tema 4 (opcional): (10P)


Cree una vista materializada que liste la situacin de todos los clientes que tengan crditos en ESTADO activo ('A')
Nombre y
Monto Fecha
Ingresos
Monto
Monto Cuotas Pagadas
Monto Cuotas
Apellido
Crdito Crdito
Gastos
Inmuebles
pendientes
(Monto Cuota +
(Monto Cuota +
Mora_calculada) de cuotas
Mora_calculada) de
pagadas
cuotas no pagadas
CREATE MATERIALIZED VIEW
V_CLIENTES
REFRESH START WITH ROUND(SYSDATE) NEXT TRUNC(SYSDATE+1)+ 3/24
AS
SELECT CL.APELLIDO ||','||CL.NOMBRE NOMBRE_APELLIDO,
C.MONTO MONTO_CREDITO,

50
25
25
100

Carrera
Examen
Profesor
Auxiliar:

ANLISIS DE SISTEMAS
2do. Final
Carmen N. Martnez W.
Lilian Riveros

Asignatura:
Seccin
Nombre Alumno

BASE DE DATOS II
J

FECHA
17-Dic-2011
PUNTAJE

Tema 1
Tema 2
Tema 3
Tema 4 (opcional)
TOTAL

C.FECHA_CREDITO,IG.INGRESOS_GASTOS, MI.MONTO_INMUEBLES,
CUO.CUOTAS_PAGADAS, CUO.CUOTAS_PENDIENTES
FROM CREDITOS C, CLIENTES CL, (SELECT ID_SOCIO,
SUM(DECODE(INGRESO_GASTO,'I',MONTO,MONTO*(-1))) INGRESOS_GASTOS
FROM INGRESOS_GASTOS
GROUP BY ID_SOCIO) IG,
(SELECT ID_SOCIO, SUM(MONTO_VALOR_FISCAL) MONTO_INMUEBLES
FROM INMUEBLES
GROUP BY ID_SOCIO) MI,
(SELECT
ID_CREDITO,
SUM(DECODE(FECHA_PAGO, NULL, MONTO_CUOTA + MORA_CALCULADA,0)) CUOTAS_PAGADAS,
SUM(DECODE(FECHA_PAGO, NULL, 0, MONTO_CUOTA + MORA_CALCULADA)) CUOTAS_PENDIENTES
FROM CUOTAS
GROUP BY ID_CREDITO) CUO
WHERE
C.ID_SOCIO = CL.ID
AND
IG.ID_SOCIO = CL.ID
AND
MI.ID_SOCIO = CL.ID
AND
CUO.ID_CREDITO = C.ID;

50
25
25
100

Potrebbero piacerti anche