Está en la página 1de 3

CREATE OR REPLACE PACKAGE PK_INFORME_CLIENTES IS

v_cod_region NUMBER(3);

--o Una función pública que, dado el número de cliente retorne el


-- total de productos de inversión que tiene registrados en cliente.
FUNCTION FN_OBT_CANT_PROD_INVER(p_nro_cliente NUMBER) RETURN NUMBER;

PROCEDURE InsertarResumenCliente(p_rut_cliente VARCHAR2, p_region_residencia


VARCHAR2,
p_mes_inscripcion NUMBER, p_mensaje VARCHAR2, p_cantidad_inversiones NUMBER,
p_rango_inversion VARCHAR2);

PROCEDURE GenerarResumenCliente(v_cod_region NUMBER);


END PK_INFORME_CLIENTES;
/

--Cuerpo del PACKAGE


CREATE OR REPLACE PACKAGE BODY PK_INFORME_CLIENTES IS

FUNCTION FN_OBT_CANT_PROD_INVER(p_nro_cliente NUMBER) RETURN NUMBER IS


v_total number;
BEGIN
SELECT COUNT(nro_solic_prod) INTO v_total
FROM PRODUCTO_INVERSION_CLIENTE
WHERE nro_cliente = p_nro_cliente

RETURN v_total;

EXCEPTION
WHEN OTHER THEN
RETURN 0;

END FN_OBT_CANT_PROD_INVER;

FUNCTION FN_OBT_RANGO_INVER(p_cantidad_inversiones NUMBER) RETURN VARCHAR2 IS


v_rango_inversion VARCHAR2(1);
BEGIN
SELECT rango INTO v_rango_inversion
FROM rango_inversion
WHERE limite_inf <= p_cantidad_inversiones AND limite_sup >=
p_cantidad_inversiones;

RETURN v_rango_inversion;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN '*'; -- En caso de que no haya datos para el rango, devuelve '*'
WHEN OTHERS THEN
RETURN '*';
END FN_OBT_RANGO_INVER;

PROCEDURE InsertarResumenCliente(p_rut_cliente VARCHAR2, p_region_residencia


VARCHAR2,
p_mes_inscripcion NUMBER, p_mensaje VARCHAR2, p_cantidad_inversiones NUMBER,
p_rango_inversion VARCHAR2)
IS
BEGIN
INSERT INTO resumen_cliente
VALUES (p_rut_cliente, p_region_residencia, p_mes_inscripcion, p_mensaje,
p_cantidad_inversiones, p_rango_inversion);
END InsertarResumenCliente;

PROCEDURE GenerarResumenCliente(v_cod_region NUMBER)


IS
CURSOR cur_clientes
IS
SELECT
c.nro_cliente,
c.numrun ||'-'|| c.dvrun AS rut_cliente,
r.cod_region,
r.nombre_region,
TO_NUMBER(TO_CHAR(c.fecha_inscripcion, 'MM')) AS mes_inscripcion
FROM cliente c JOIN region r
ON c.cod_region = r.cod_region
WHERE c.cod_region = v_cod_region;
v_mensaje VARCHAR2(100);
v_cantidad_inversiones NUMBER;
v_rango_inversion VARCHAR2(1);
v_error VARCHAR2(100);
BEGIN
EXECUTE IMMEDIATE 'TRUNCATE TABLE resumen_cliente';
EXECUTE IMMEDIATE 'TRUNCATE TABLE error_proceso';
--RECORRIDO CURSOR
FOR reg_clientes IN cur_clientes LOOP

v_mensaje := FN_OBT_MENSAJE_ANI(mes_inscripcion);

v_cantidad_inversiones := FN_OBT_CANT_PROD_INVER(reg_clientes.rut_cliente);

v_rango_inversion := FN_OBT_RANGO_INVER(v_cantidad_inversiones);

InsertarResumenCliente (reg_clientes.rut_cliente, nombre_region,


mes_inscripcion,
v_mensaje, v_cantidad_inversiones, v_rango_inversion);

END LOOP;

EXCEPTION
WHEN OTHERS THEN
v_error := SQLCODE||' '||SQLERRM;
INSERT INTO ERROR_PROCESO
VALUES (SEQ_ERROR.NEXTVAL, 'GenerarResumenCliente', v_error);
END GenerarResumenCliente;
END PK_INFORME_CLIENTES;
/

--BLOQUE ANONIMO
BEGIN

PK_INFORME_CLIENTES.GenerarResumenCliente(6);

END;

También podría gustarte