Sie sind auf Seite 1von 7

CASO 1.

PROCESO DE DEPURACIÓN DE INFORMACIÓN

Se requiere realizar una depuración de información de la base de datos de producción. Se parte de


las siguientes premisas:

 La base de datos almacena en varias tablas información relacionada con obligaciones crediticias
(Créditos).
 La información básica de cada crédito se almacena en la tabla CREDITOS.
 Cada crédito tiene un estado: Cancelado (C) o Activo (A).
 Las otras tablas tienen información operativa del crédito que va siendo creada o actualizada
durante la vida del crédito, asociada siempre a una fecha de registro de la información. Esta
información operativa puede ser:
o Diaria: La correspondiente a saldos y transacciones de los créditos (Tablas
SALDOS_SISTEMA_CARTERA y TRANSACCIONES_INTERNAS)
o Eventual: Correspondiente a eventos no periódicos que les suceden a los créditos.
(Tablas PAGOS y APLICACIONES_PAGOS)

El proceso que se necesita implementar debe tomar la información completa de cada crédito (básica
y operativa) y copiarla y/o moverla hacia un conjunto de tablas espejo ubicadas sobre la misma base
de datos. Cuando se copia o cuando se mueve la información depende del estado de cada crédito:

1. La información de los créditos cancelados debe ser trasladada completamente hacia las tablas
históricas. Es decir, se debe copiar a las tablas históricas y eliminar de las tablas básicas y
operativas.
2. La información de los créditos activos debe ser:
a. La básica debe copiada a las tablas históricas
b. La eventual copiada a las tablas históricas
c. La diaria copiada a las tablas históricas y eliminada de las tablas operativas la que sea
anterior a 90 días respecto a la fecha de ejecución del proceso.

La depuración de cada crédito debe ser considerada una transacción. Es decir, el proceso debe ser
completo para cada crédito y un error en la depuración de un crédito no debe detener el proceso
completo. Se debe dejar log de los errores del proceso para poder hacer una revisión al final del
mismo.

Por cada crédito se debe dejar registro de la fecha en que se ejecutó el proceso de depuración.

El modelo de datos de las tablas básicas y operativas es el siguiente:


CREDITOS 1
Numero_credito
Estado

1 1 1
SALDOS_SISTEMA_CARTERA
PAGOS Numero_credito
Numero_credito Estado
n
Fecha_pago n Fecha

1
1
n
n
APLICACIONES_PAGOS TRANSACCIONES_INTERNAS
Numero_credito
Numero_credito
Fecha
Fecha_pago

CALIFICACIONES
Numero_credito
Fecha

Resuelva:

1. Diseñe las tablas históricas (y las relaciones entre ellas) que considere necesarias para la
implementación del proceso.
2. Especifique las etapas que debe contemplar el proceso de depuración de información.
3. Escriba los algoritmos necesarios para la implementación de cada una de las etapas del proceso.

Haga los supuestos que considere necesarios.


Supuestos : motor de base de datos Oracle y programación pl/sql

1. Se propone crear las siguientes tablas históricas


 Historial_eventual
 Historial_diario
CREDITOS 1
Numero_credito
Estado

1 1 1
SALDOS_SISTEMA_CARTERA
PAGOS Numero_credito
Numero_credito Estado
n
Fecha_pago n Fecha

1
1
n
n
APLICACIONES_PAGOS TRANSACCIONES_INTERNAS
Numero_credito
Numero_credito
Fecha
Fecha_pago
1
1

n n n
n
HISTORIAL_EVENTUAL HISTORIAL_ DIARIO
Numero_credito CALIFICACIONES Numero_credito
Fecha_pago Numero_credito Fecha
Fecha Estado

Se propone crear las tablas de la siguiente manera, solo la estructura y vacías:

CREATE TABLE HISTORIAL_EVENTUAL AS


SELECT A.*,B.*, C.* FROM
CREDITOS A,PAGOS B, APLICACIONES_PAGOS C
WHERE A.NUMERO_CREDITO=B.NUMERO_CREDITO
AND B.NUMERO_CREDITO=C.NUMERO_CREDITO
AND 1=0;
CREATE TABLE HISTORIAL_DIARIO AS
SELECT A.*,B.*, C.* FROM
CREDITOS A,SALDOS_SISTEMAS_CARTERA B,TRANSACCIONES_INTERNAS C
WHERE A.NUMERO_CREDITO=B.NUMERO_CREDITO
AND A.NUMERO_CREDITO=C.NUMERO_CREDITO
AND 1=0;

Para el punto 2 se deben considerar créditos activos y los créditos cancelados por separado para los
diferentes procesos que se requieren según el enunciado.

Se propone el siguiente paquete en plsql donde se explicará la lógica

Especificación del paquete.


create or replace package pk_depura_credito
as
v_archivo utl_file.file_type;
procedure pr_debug_cancelados;
procedure pr_debug_activos;
/

Cuerpo del paquete


create or replace package body pk_depura_credito
as
v_archivo utl_file.file_type;
--CREDITOS CANCELADOS
procedure pr_debug_cancelados is
cursor c is
select * from creditos
where estado='C';
is
begin
--ARCHIVO LOG ERRORES
v_archivo := utl_file.fopen ('DIR_TMP',
'LOG_DEBUG_CREDITOS_A.txt', 'w');
for i in c loop
BEGIN
--EVENTUAL
--Se inserta en las tablas históricas
insert into HISTORIAL_EVENTUAL values
SELECT A.*,B.*, C.* FROM
CREDITOS A,PAGOS B, APLICACIONES_PAGOS C
WHERE A.NUMERO_CREDITO=B.NUMERO_CREDITO
AND B.NUMERO_CREDITO=C.NUMERO_CREDITO
and a.NUMERO_CREDITO=i.NUMERO_CREDITO;
commit;
EXCEPTION
WHEN OTHERS THEN
utl_file.put_line (v_archivo,'EVENTUAL ' ||I.NUMERO_CREDITO||
' '||SQLERRM);
ROLLBACK;
END;
--DIARIO
BEGIN
insert into HISTORIAL_DIARIO VALUES
SELECT A.*,B.*, C.* FROM
CREDITOS A,SALDOS_SISTEMAS_CARTERA B,TRANSACCIONES_INTERNAS C
WHERE A.NUMERO_CREDITO=B.NUMERO_CREDITO
AND A.NUMERO_CREDITO=C.NUMERO_CREDITO
and a.NUMERO_CREDITO=i.NUMERO_CREDITO;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
--LOG
utl_file.put_line (v_archivo, 'DIARIO '||I.NUMERO_CREDITO|| '
'||SQLERRM);
ROLLBACK;
END;
--se elimina la información de las tablas operativas y la basica
--EVENTUALES
DELETE FROM APLICACIONES_PAGOS WHERE
NUMERO_CREDITO=I.NUMERO_CREDITO;
DELETE FROM PAGOS WHERE CREDITO=I.CREDITO;
--DIARIAS
DELETE FROM SALDOS_SISTEMA_CARTERA WHERE
NUMERO_CREDITO=I.NUMERO_CREDITO;
DELETE FROM TRANSACCIONES_INTERNAS WHERE
NUMERO_CREDITO=I.NUMERO_CREDITO;
--BASICA
DELETE FROM CREDITOS WHERE NUMERO_CREDITO=I.NUMERO_CREDITO;

commit;

end loop;
utl_file.fclose(v_archivo);
exception when others then
utl_file.put_line (v_archivo,'GENERAL '||sqlERRM);
rollback;
utl_file.fclose(v_archivo);
end;

--CREDITOS ACTIVOS

procedure pr_debug_activos IS
cursor c is
SELECT A.*,B.*, C.* FROM
CREDITOS A,PAGOS B, APLICACIONES_PAGOS C
WHERE A.NUMERO_CREDITO=B.NUMERO_CREDITO
AND B.NUMERO_CREDITO=C.NUMERO_CREDITO
and a.estado='A';
cursor c2 is
SELECT A.*,B.*, C.* FROM
CREDITOS A,SALDOS_SISTEMAS_CARTERA B,TRANSACCIONES_INTERNAS C
WHERE A.NUMERO_CREDITO=B.NUMERO_CREDITO
AND A.NUMERO_CREDITO=C.NUMERO_CREDITO
is
begin
--ARCHIVO LOG ERRORES
v_archivo := utl_file.fopen ('DIR_TMP',
'LOG_DEBUG_CREDITOS_C.txt', 'w');

--EVENTUAL
for i in c loop
BEGIN
insert into HISTORIAL_EVENTUAL values
SELECT A.*,B.*, C.* FROM
CREDITOS A,PAGOS B, APLICACIONES_PAGOS C
WHERE A.NUMERO_CREDITO=B.NUMERO_CREDITO
AND B.NUMERO_CREDITO=C.NUMERO_CREDITO
and a.credito=i.credito;
commit;
EXCEPTION
WHEN OTHERS THEN
--LOG
utl_file.put_line (v_archivo, 'EVENTUAL ' ||I.NUMERO_CREDITO||
' '||SQLERRM);
ROLLBACK;
END;
end loop;
--DIARIO
for K in c2 loop
BEGIN
insert into HISTORIAL_DIARIO VALUES
SELECT A.*,B.*, C.* FROM
CREDITOS A,SALDOS_SISTEMAS_CARTERA B,TRANSACCIONES_INTERNAS C
WHERE A.NUMERO_CREDITO=B.NUMERO_CREDITO
AND A.NUMERO_CREDITO=C.NUMERO_CREDITO
and a.credito=K.credito;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
--LOG
utl_file.put_line (v_archivo, 'DIARIO '||K.NUMERO_CREDITO|| '
'||SQLERRM);
ROLLBACK;
END;

IF K.FECHA < SYSDATE-90 THEN


--se elimina la información de las tablas operativas DIARIAS
--DIARIAS
DELETE FROM SALDOS_SISTEMA_CARTERA WHERE
NUMERO_CREDITO=K.NUMERO_CREDITO;
DELETE FROM TRANSACCIONES_INTERNAS WHERE
NUMERO_CREDITO=K.NUMERO_CREDITO;
commit;
END IF;
END LOOP;

utl_file.fclose(v_archivo);
exception when others then
utl_file.put_line (v_archivo,'GENERAL '||sqlERRM);
COMMIT;
utl_file.fclose(v_archivo);
rollback;
end;