SIGESA: VISTA AVANCE PPI BTPPI-342 Consulta: AVANCE PLP

  • https://universidadnacional.atlassian.net/jira/software/c/projects/BTPPI/boards/161?selectedIssue=BTPPI-342
  • Para resolver esta consulta se van a crear una serie de funciones para facilitar la obtención y presentación de datos
  • PODEMOS DESCARGAR EL SCRIPT AQUÍ
  • Y PODEMOS DESCARGAR EL RESTO DE RECURSOS: AQUÍ

PARTE1: FUNCIONES DE BD

FUNCION: PPE_OBTENER_METAS_OPE_FUNCIONALES

--*******************************************************************************
--*******************************************************************************
-- FUNCIÓN: PPE_OBTENER_METAS_OPE_FUNCIONALES
--*******************************************************************************
--*******************************************************************************

--+++++++++++++++++++++++++++++++++++++++++++++++++++++
-- PASO 0: ELIMINACIÓN DE DATOS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
DROP TYPE PPI.PPE_PERIODO_ANUAL_META_POA_TABLE_TYPE;
DROP TYPE PPI.PPE_PERIODO_ANUAL_META_POA_TYPE;
DROP FUNCTION PPI.PPE_OBTENER_METAS_OPE_FUNCIONALES;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 01: Crear TIPO de tipo de dato META_POA
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE TYPE PPI.PPE_PERIODO_ANUAL_META_POA_TYPE AS OBJECT (
    PERIODO_ANUAL NUMBER,
    META_POA NUMBER
);

GRANT EXECUTE ON PPI.PPE_PERIODO_ANUAL_META_POA_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 02: Crear TABLA de tipo de dato MetaPoaType
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE TYPE PPI.PPE_PERIODO_ANUAL_META_POA_TABLE_TYPE AS TABLE OF PPE_PERIODO_ANUAL_META_POA_TYPE;

GRANT EXECUTE ON PPI.PPE_PERIODO_ANUAL_META_POA_TABLE_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;

--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 03: Crear FUNCIÓN
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE FUNCTION  PPI.PPE_OBTENER_METAS_OPE_FUNCIONALES
RETURN PPE_PERIODO_ANUAL_META_POA_TABLE_TYPE PIPELINED AS

BEGIN
    FOR rec IN (
        SELECT 
            DISTINCT
            PO.PERIODO_ANUAL,
            MPE.META_POA
        FROM META_POA_EVALUACION MPE
        INNER JOIN META_POA MP ON (MP.ID_META_POA = MPE.META_POA)
        INNER JOIN OBJETIVO_POA OP ON (OP.ID_OBJETIVO_POA = MP.OBJETIVO_POA)
        INNER JOIN PLAN_OPERATIVO PO ON (PO.ID_PLAN_OPERATIVO = OP.PLAN_OPERATIVO)
        INNER JOIN UNIDAD_EJECUTORA UE_PO ON (UE_PO.ID_UNIDAD_EJECUTORA = PO.UNIDAD_EJECUTORA)
        INNER JOIN EVALUACION_OPERATIVA EO ON (EO.PLAN_OPERATIVO = PO.ID_PLAN_OPERATIVO)
        WHERE 
        PO.ESTADO_FORMULACION_OPE IN (SELECT VALOR FROM PARAMETRO WHERE LLAVE IN ('param_ppi_ppo_estadoFormulacionOpe_aprobado_unSoloNivel', 'param_ppi_ppo_estadoFormulacionOpe_aprobado_unidad_integradora'))
        AND PO.TIPO_PLAN_OPERATIVO = (SELECT VALOR FROM PARAMETRO WHERE LLAVE = 'param_ppi_ppo_tipoPlanOperativo_unidad')
        AND EO.ESTADO_EVALUACION_POA IN (SELECT VALOR FROM PARAMETRO WHERE LLAVE IN ('param_ppi_ppo_estadoEvaluacionPOA_aprobado_unSoloNivel', 'param_ppi_ppo_estadoEvaluacionPOA_aprobado_unidad_integradora'))
        AND MPE.ETAPA_PLAN = EO.ETAPA_PLAN
        AND EO.FECHA_APROBACION = (
            SELECT 
                MAX(EO.FECHA_APROBACION) 
            FROM 
            EVALUACION_OPERATIVA EO1
            INNER JOIN PLAN_OPERATIVO PO1 ON (PO1.ID_PLAN_OPERATIVO = EO1.PLAN_OPERATIVO)
            WHERE 
            PO1.ID_PLAN_OPERATIVO = PO.ID_PLAN_OPERATIVO
            AND PO1.UNIDAD_EJECUTORA = PO.UNIDAD_EJECUTORA
        )
        ORDER BY MPE.META_POA
    ) LOOP
        PIPE ROW (PPE_PERIODO_ANUAL_META_POA_TYPE(REC.PERIODO_ANUAL,REC.META_POA));
    END LOOP;

    RETURN;

END PPE_OBTENER_METAS_OPE_FUNCIONALES;

--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 04: GRANTS MetaPoa
--+++++++++++++++++++++++++++++++++++++++++++++++++++++

--***********************************************
-- GRANT'S
--***********************************************
GRANT EXECUTE ON PPI.PPE_OBTENER_METAS_OPE_FUNCIONALES TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 05: CONSULTAR DATOS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
SELECT * FROM TABLE(PPI.PPE_OBTENER_METAS_OPE_FUNCIONALES());

FUNCIÓN: PPE_OBTENER_PERIODOS_ANUALES_DISTRIBUCION

--*******************************************************************************
--*******************************************************************************
-- FUNCIÓN: PPE_OBTENER_PERIODOS_ANUALES_DISTRIBUCION
--*******************************************************************************
--*******************************************************************************

--+++++++++++++++++++++++++++++++++++++++++++++++++++++
-- PASO 0: ELIMINACIÓN DE DATOS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
DROP TYPE PPI.PPE_PERIODO_ANUAL_TABLE_TYPE;
DROP TYPE PPI.PPE_PERIODO_ANUAL_TYPE;
DROP FUNCTION PPI.PPE_OBTENER_PERIODOS_ANUALES_DISTRIBUCION;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 01: Crear TIPO de tipo de dato
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE TYPE PPI.PPE_PERIODO_ANUAL_TYPE AS OBJECT (
    PERIODO_ANUAL   NUMBER
);

GRANT EXECUTE ON PPI.PPE_PERIODO_ANUAL_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 02: Crear TABLA de tipo de dato PERIODO_ANUAL_TYPE
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE TYPE PPI.PPE_PERIODO_ANUAL_TABLE_TYPE AS TABLE OF PPE_PERIODO_ANUAL_TYPE;

GRANT EXECUTE ON PPI.PPE_PERIODO_ANUAL_TABLE_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 03: Crear FUNCIÓN
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE FUNCTION  PPI.PPE_OBTENER_PERIODOS_ANUALES_DISTRIBUCION
RETURN PPE_PERIODO_ANUAL_TABLE_TYPE PIPELINED AS

BEGIN
    FOR REC IN (
        SELECT 
            DISTINCT
            APD.PERIODO_ANUAL PERIODO_ANUAL
        FROM
        META_POA_APORTE MPAP
        INNER JOIN (SELECT *
        FROM TABLE(PPI.PPE_OBTENER_METAS_OPE_FUNCIONALES())) METAS_FUNCIONALES ON MPAP.META_POA = METAS_FUNCIONALES.META_POA
        INNER JOIN APORTE_ESTRATEGICO APE ON (APE.ID_APORTE_ESTRATEGICO = MPAP.APORTE_ESTRATEGICO)
        INNER JOIN APORTE_PAE_DISTRIBUCION APD ON (APD.APORTE_ESTRATEGICO = APE.ID_APORTE_ESTRATEGICO)
        ORDER BY APD.PERIODO_ANUAL
    ) LOOP
        PIPE ROW (PPE_PERIODO_ANUAL_TYPE(REC.PERIODO_ANUAL));
    END LOOP;

    RETURN;

END PPE_OBTENER_PERIODOS_ANUALES_DISTRIBUCION;

--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 04: GRANTS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
GRANT EXECUTE ON  PPI.PPE_OBTENER_PERIODOS_ANUALES_DISTRIBUCION TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 05: CONSULTAR DATOS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
SELECT * FROM TABLE(PPI.PPE_OBTENER_PERIODOS_ANUALES_DISTRIBUCION());

FUNCION: PPE_OBTENER_APD_X_APORTE

--*******************************************************************************
--*******************************************************************************
-- FUNCIÓN: PPE_OBTENER_APD_X_APORTE
--*******************************************************************************
--*******************************************************************************


--*****************************************************
--COMPONENTE REQUERIDO: AÑO
--*****************************************************

--+++++++++++++++++++++++++++++++++++++++++++++++++++++
-- PASO 0: ELIMINACIÓN DE DATOS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
DROP TYPE PPI.PPE_ANO_TABLE_TYPE;
DROP TYPE PPI.PPE_ANO_TYPE;

--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 01: Crear TIPO de tipo de dato 
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE TYPE PPI.PPE_ANO_TYPE AS OBJECT (
    ANO NUMBER(4)
);
GRANT EXECUTE ON PPI.PPE_ANO_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 02: Crear TABLA de tipo de dato ANO_TYPE
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE TYPE PPI.PPE_ANO_TABLE_TYPE AS TABLE OF PPE_ANO_TYPE;

GRANT EXECUTE ON PPI.PPE_ANO_TABLE_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;





--*****************************************************
--FUNCIÓN: PPE_OBTENER_APD_X_APORTE
--*****************************************************

--+++++++++++++++++++++++++++++++++++++++++++++++++++++
-- PASO 0: ELIMINACIÓN DE DATOS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
DROP TYPE PPI.PPE_APD_TABLE_TYPE;
DROP TYPE PPI.PPE_APD_TYPE;
DROP FUNCTION PPI.PPE_OBTENER_APD_X_APORTE;



--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 01: Crear TIPO de tipo de dato 
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE TYPE PPI.PPE_APD_TYPE AS OBJECT (
    APORTE_ESTRATEGICO      NUMBER,
    DISTRIBUCION_1          NUMBER,
    DISTRIBUCION_2          NUMBER,
    DISTRIBUCION_3          NUMBER,
    DISTRIBUCION_4          NUMBER,
    DISTRIBUCION_5          NUMBER
);
GRANT EXECUTE ON PPI.PPE_APD_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 02: Crear TABLA de tipo de dato APD_TYPE
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE TYPE PPI.PPE_APD_TABLE_TYPE AS TABLE OF PPE_APD_TYPE;

GRANT EXECUTE ON PPI.PPE_APD_TABLE_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 03: Crear FUNCIÓN
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE FUNCTION PPI.PPE_OBTENER_APD_X_APORTE
--RETURN: tabla virtual de tipo APD_TABLE_TYPE
RETURN PPE_APD_TABLE_TYPE PIPELINED AS

    --***************************************************************
    --VARIABLES
    --***************************************************************
    -- Almacena los años en un arreglo
    v_periodos  PPE_PERIODO_ANUAL_TABLE_TYPE := PPE_PERIODO_ANUAL_TABLE_TYPE();

    -- Variable para almacenar el año actual
    v_periodo PPE_PERIODO_ANUAL_TYPE;


    -- Almacena los años en un arreglo
    v_anos PPE_ANO_TABLE_TYPE := PPE_ANO_TABLE_TYPE();

    -- Variable para almacenar el año actual
    v_ano PPE_ANO_TYPE;

    -- Variable para construir la consulta PIVOT
    v_sql CLOB;

    -- Variable para almacenar el resultado de la consulta PIVOT
    v_result SYS_REFCURSOR;

    -- Variables para almacenar los valores dinámicos de las columnas del PIVOT
    v_aporte            NUMBER;
    v_distribucion_1    NUMBER;
    v_distribucion_2    NUMBER;
    v_distribucion_3    NUMBER;
    v_distribucion_4    NUMBER;
    v_distribucion_5    NUMBER;

BEGIN
    --***************************************************************
    --OBTENCIÓN DE DATOS
    --***************************************************************
    -- Ejecutar consulta del ID_PERIODO_ANUAL y  ANO para almacenarlos en arreglos para crear el PIVOT 
    FOR REC IN (SELECT ANO, ID_PERIODO_ANUAL
                FROM PERIODO_ANUAL
                WHERE ID_PERIODO_ANUAL IN (SELECT PERIODO_ANUAL
                                           FROM TABLE(PPI.PPE_OBTENER_PERIODOS_ANUALES_DISTRIBUCION()))
                ORDER BY ANO)
    LOOP
        -- Utilizar el constructor del tipo ANO_TYPE
        v_ano := PPE_ANO_TYPE(REC.ANO);

        -- Utilizar el constructor del tipo ANO_TYPE
        v_periodo := PPE_PERIODO_ANUAL_TYPE(REC.ID_PERIODO_ANUAL);

       -- Añadir los resultados al arreglo de años
        v_periodos.EXTEND;
        v_periodos(v_periodos.LAST) := v_periodo;

        -- Añadir los resultados al arreglo de años
        v_anos.EXTEND;
        v_anos(v_anos.LAST) := v_ano;

    END LOOP;


    --**************************************************************
    --CONSULTA DINÁMICA
    --**************************************************************
    v_sql := 'SELECT ';
    v_sql := v_sql || '* ';
    v_sql := v_sql || 'FROM ( ';
    v_sql := v_sql || 'SELECT ';
    v_sql := v_sql || 'DISTINCT ';
    v_sql := v_sql || 'APD.APORTE_ESTRATEGICO, ';
    v_sql := v_sql || 'APD.PERIODO_ANUAL, ';
    v_sql := v_sql || 'APD.DISTRIBUCION_PORCENTUAL ';
    v_sql := v_sql || 'FROM META_POA_APORTE MPAP ';
    v_sql := v_sql || 'INNER JOIN ( ';
    v_sql := v_sql || 'SELECT * FROM TABLE(PPI.PPE_OBTENER_METAS_OPE_FUNCIONALES()) ';
    v_sql := v_sql || ') METAS_FUNCIONALES ON MPAP.META_POA = METAS_FUNCIONALES.META_POA ';
    v_sql := v_sql || 'INNER JOIN APORTE_ESTRATEGICO APE ON APE.ID_APORTE_ESTRATEGICO = MPAP.APORTE_ESTRATEGICO ';
    v_sql := v_sql || 'INNER JOIN APORTE_PAE_DISTRIBUCION APD ON APD.APORTE_ESTRATEGICO = APE.ID_APORTE_ESTRATEGICO ';
    v_sql := v_sql || 'WHERE APD.PERIODO_ANUAL IN ( ';
    v_sql := v_sql || 'SELECT * FROM TABLE(PPI.PPE_OBTENER_PERIODOS_ANUALES_DISTRIBUCION()) ';
    v_sql := v_sql || ') ';
    v_sql := v_sql || ') ';
    v_sql := v_sql || 'PIVOT (MAX(DISTRIBUCION_PORCENTUAL) FOR PERIODO_ANUAL IN (';
    

    FOR i IN 1..v_anos.LAST LOOP
        v_sql := v_sql || v_periodos(i).PERIODO_ANUAL || ' as "' || v_anos(i).ANO || '"';
        IF i < v_anos.LAST THEN
            v_sql := v_sql || ', ';
        END IF;
    END LOOP;

    v_sql := v_sql || ')) ORDER BY APORTE_ESTRATEGICO';


    -- Ejecutar la consulta PIVOT
    OPEN v_result FOR v_sql;

    --**************************************************************
    --RECUPERAR Y FORMATEAAR LOS DATOS
    --**************************************************************
    LOOP
       FETCH v_result INTO v_aporte,v_distribucion_1, v_distribucion_2, v_distribucion_3, v_distribucion_4, v_distribucion_5;
       EXIT WHEN v_result%NOTFOUND;

       PIPE ROW(PPE_APD_TYPE(v_aporte,v_distribucion_1, v_distribucion_2, v_distribucion_3, v_distribucion_4, v_distribucion_5));
    END LOOP;

    CLOSE v_result;

    RETURN;

END PPE_OBTENER_APD_X_APORTE;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 04: GRANTS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++


--***********************************************
-- GRANT'S
--***********************************************
GRANT EXECUTE ON  PPI.PPE_OBTENER_APD_X_APORTE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 05: CONSULTAR DATOS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
SELECT * FROM TABLE(PPI.PPE_OBTENER_APD_X_APORTE());

FUNCION: PPE_OBTENER_PROMEDIOS_X_APORTE

--*****************************************************
--FUNCIÓN: PPE_OBTENER_PROMEDIOS_X_APORTE
--*****************************************************

--+++++++++++++++++++++++++++++++++++++++++++++++++++++
-- PASO 0: ELIMINACIÓN DE DATOS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
DROP TYPE PPI.PPE_APORTE_PROMEDIOS_TABLE_TYPE;
DROP TYPE PPI.PPE_APORTE_PROMEDIOS_TYPE;
DROP FUNCTION PPI.PPE_OBTENER_PROMEDIOS_X_APORTE;



--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 01: Crear TIPO de tipo de dato 
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE TYPE PPI.PPE_APORTE_PROMEDIOS_TYPE AS OBJECT (
    APORTE_ESTRATEGICO      NUMBER,
    PROMEDIO_1              NUMBER,
    PROMEDIO_2              NUMBER,
    PROMEDIO_3              NUMBER,
    PROMEDIO_4              NUMBER,
    PROMEDIO_5              NUMBER
);

GRANT EXECUTE ON PPI.PPE_APORTE_PROMEDIOS_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 02: Crear TABLA de tipo de dato 
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE TYPE PPI.PPE_APORTE_PROMEDIOS_TABLE_TYPE AS TABLE OF PPE_APORTE_PROMEDIOS_TYPE;

GRANT EXECUTE ON PPI.PPE_APORTE_PROMEDIOS_TABLE_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 03: Crear FUNCIÓN
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE FUNCTION PPI.PPE_OBTENER_PROMEDIOS_X_APORTE
--RETURN: tabla virtual de tipo APD_TABLE_TYPE
RETURN PPE_APORTE_PROMEDIOS_TABLE_TYPE PIPELINED AS

    --***************************************************************
    --VARIABLES
    --***************************************************************
    -- Almacena los años en un arreglo
    v_periodos  PPE_PERIODO_ANUAL_TABLE_TYPE := PPE_PERIODO_ANUAL_TABLE_TYPE();
    
    -- Variable para almacenar el año actual
    v_periodo PPE_PERIODO_ANUAL_TYPE;
    
    
    -- Almacena los años en un arreglo
    v_anos PPE_ANO_TABLE_TYPE := PPE_ANO_TABLE_TYPE();
    
    -- Variable para almacenar el año actual
    v_ano PPE_ANO_TYPE;

    -- Variable para construir la consulta PIVOT
    v_sql CLOB;

    -- Variable para almacenar el resultado de la consulta PIVOT
    v_result SYS_REFCURSOR;

    -- Variables para almacenar los valores dinámicos de las columnas del PIVOT
    v_aporte        NUMBER;
    v_promedio_1    NUMBER;
    v_promedio_2    NUMBER;
    v_promedio_3    NUMBER;
    v_promedio_4    NUMBER;
    v_promedio_5    NUMBER;

BEGIN
    --***************************************************************
    --OBTENCIÓN DE DATOS
    --***************************************************************
    -- Ejecutar consulta del ID_PERIODO_ANUAL y  ANO para almacenarlos en arreglos para crear el PIVOT 
    FOR REC IN (SELECT ANO, ID_PERIODO_ANUAL
                FROM PERIODO_ANUAL
                WHERE ID_PERIODO_ANUAL IN (SELECT PERIODO_ANUAL
                                           FROM TABLE(PPI.PPE_OBTENER_PERIODOS_ANUALES_DISTRIBUCION()))
                ORDER BY ANO)
    LOOP
        -- Utilizar el constructor del tipo ANO_TYPE
        v_ano := PPE_ANO_TYPE(REC.ANO);
    
        -- Utilizar el constructor del tipo ANO_TYPE
        v_periodo := PPE_PERIODO_ANUAL_TYPE(REC.ID_PERIODO_ANUAL);
    
       -- Añadir los resultados al arreglo de años
        v_periodos.EXTEND;
        v_periodos(v_periodos.LAST) := v_periodo;
    
        -- Añadir los resultados al arreglo de años
        v_anos.EXTEND;
        v_anos(v_anos.LAST) := v_ano;
    
    END LOOP;


    --**************************************************************
    --CONSULTA DINÁMICA
    --**************************************************************
    v_sql := 'SELECT ';
    v_sql := v_sql || '* ';
    v_sql := v_sql || 'FROM ( ';
    v_sql := v_sql || 'SELECT ';
    v_sql := v_sql || 'EP.PERIODO_ANUAL, ';
    v_sql := v_sql || 'MPA.APORTE_ESTRATEGICO, ';
    v_sql := v_sql || 'NVL(AVG(MPE.EJECUCION),0) PROMEDIO ';
    v_sql := v_sql || 'FROM ';
    v_sql := v_sql || 'META_POA_APORTE MPA ';
    v_sql := v_sql || 'INNER JOIN ( ';
    v_sql := v_sql || 'SELECT * FROM TABLE( ';
    v_sql := v_sql || 'PPI.PPE_OBTENER_METAS_OPE_FUNCIONALES() ';
    v_sql := v_sql || ') ';
    v_sql := v_sql || ') METAS_FUNCIONALES ON MPA.META_POA = METAS_FUNCIONALES.META_POA ';
    v_sql := v_sql || 'INNER JOIN META_POA_EVALUACION MPE ON (MPE.META_POA = MPA.META_POA) ';
    v_sql := v_sql || 'INNER JOIN ETAPA_PLAN EP ON (EP.ID_ETAPA_PLAN = MPE.ETAPA_PLAN) ';
    v_sql := v_sql || 'WHERE ';
    v_sql := v_sql || 'MPE.ETAPA_PLAN = ( ';
    v_sql := v_sql || 'SELECT ';
    v_sql := v_sql || 'EP1.ID_ETAPA_PLAN ';
    v_sql := v_sql || 'FROM ETAPA_PLAN EP1 ';
    v_sql := v_sql || 'WHERE ';
    v_sql := v_sql || 'EP1.TIPO_ETAPA = (SELECT VALOR FROM PARAMETRO WHERE LLAVE = ''param_ppi_ppo_tipoEtapa_evaluacion'') ';
    v_sql := v_sql || 'AND EP1.PERIODO_ANUAL = EP.PERIODO_ANUAL ';
    v_sql := v_sql || 'AND EP1.TIPO_PLAN_OPERATIVO = (SELECT VALOR FROM PARAMETRO WHERE LLAVE = ''param_ppi_ppo_tipoPlanOperativo_unidad'') ';
    v_sql := v_sql || 'AND EP1.FECHA_FINAL_EVALUACION <= TRUNC(SYSDATE) ';
    v_sql := v_sql || 'ORDER BY ';
    v_sql := v_sql || 'EP1.FECHA_FINAL_EVALUACION DESC ';
    v_sql := v_sql || 'FETCH FIRST 1 ROW ONLY ';
    v_sql := v_sql || ') ';
    v_sql := v_sql || 'GROUP BY EP.PERIODO_ANUAL, MPA.APORTE_ESTRATEGICO, MPE.ETAPA_PLAN ';
    v_sql := v_sql || 'ORDER BY ';
    v_sql := v_sql || 'MPA.APORTE_ESTRATEGICO ';
    v_sql := v_sql || ') ';
    v_sql := v_sql || 'PIVOT (MAX(PROMEDIO) FOR PERIODO_ANUAL IN ( ';

    FOR i IN 1..v_anos.LAST LOOP
        v_sql := v_sql || v_periodos(i).PERIODO_ANUAL || ' as "' || v_anos(i).ANO || '"';
        IF i < v_anos.LAST THEN
            v_sql := v_sql || ', ';
        END IF;
    END LOOP;

    v_sql := v_sql || ')) ORDER BY APORTE_ESTRATEGICO';


    -- Ejecutar la consulta PIVOT
    OPEN v_result FOR v_sql;

    --**************************************************************
    --RECUPERAR Y FORMATEAAR LOS DATOS
    --**************************************************************
    LOOP
       FETCH v_result INTO v_aporte,v_promedio_1, v_promedio_2, v_promedio_3, v_promedio_4, v_promedio_5;
       EXIT WHEN v_result%NOTFOUND;

       PIPE ROW(PPE_APORTE_PROMEDIOS_TYPE(v_aporte,v_promedio_1, v_promedio_2, v_promedio_3, v_promedio_4, v_promedio_5));
    END LOOP;

    CLOSE v_result;

    RETURN;

END PPE_OBTENER_PROMEDIOS_X_APORTE;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 04: GRANTS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++


--***********************************************
-- GRANT'S
--***********************************************
GRANT EXECUTE ON  PPI.PPE_OBTENER_PROMEDIOS_X_APORTE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 05: CONSULTAR DATOS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
SELECT * FROM TABLE(PPI.PPE_OBTENER_PROMEDIOS_X_APORTE());

FUNCION: PPE_OBTENER_ACUMULADO_X_APORTE

--*******************************************************************************
--*******************************************************************************
-- FUNCIÓN: PPE_OBTENER_ACUMULADO_X_APORTE
--*******************************************************************************
--*******************************************************************************

--+++++++++++++++++++++++++++++++++++++++++++++++++++++
-- PASO 0: ELIMINACIÓN DE DATOS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
DROP TYPE PPI.PPE_ACUMULADO_APORTE_TABLE_TYPE;
DROP TYPE PPI.PPE_ACUMULADO_APORTE_TYPE;
DROP FUNCTION PPI.PPE_OBTENER_ACUMULADO_X_APORTE;



--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 01: Crear TIPO de tipo de dato APD_TYPE
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE TYPE PPI.PPE_ACUMULADO_APORTE_TYPE AS OBJECT (
    APORTE_ESTRATEGICO                              NUMBER,
    CANTIDAD_APORTES_X_ACCION                       NUMBER,
    REPRESENTATIVIDAD                               NUMBER,
    DISTRIBUCION_1                                  NUMBER,
    DISTRIBUCION_2                                  NUMBER,
    DISTRIBUCION_3                                  NUMBER,
    DISTRIBUCION_4                                  NUMBER,
    DISTRIBUCION_5                                  NUMBER,
    PROGRAMACION_1                                  NUMBER,
    PROGRAMACION_2                                  NUMBER,
    PROGRAMACION_3                                  NUMBER,
    PROGRAMACION_4                                  NUMBER,
    PROGRAMACION_5                                  NUMBER,
    PROMEDIO_1                                      NUMBER,
    PROMEDIO_2                                      NUMBER,
    PROMEDIO_3                                      NUMBER,
    PROMEDIO_4                                      NUMBER,
    PROMEDIO_5                                      NUMBER,
    EJECUCION_1                                     NUMBER,
    EJECUCION_2                                     NUMBER,
    EJECUCION_3                                     NUMBER,
    EJECUCION_4                                     NUMBER,
    EJECUCION_5                                     NUMBER,
    ACUMULADO_APORTE                                NUMBER
);

GRANT EXECUTE ON PPI.PPE_ACUMULADO_APORTE_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 02: Crear TABLA de tipo de dato ACUMULADO_TYPE
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE TYPE PPI.PPE_ACUMULADO_APORTE_TABLE_TYPE AS TABLE OF PPE_ACUMULADO_APORTE_TYPE;

GRANT EXECUTE ON PPI.PPE_ACUMULADO_APORTE_TABLE_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 03: Crear FUNCIÓN
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE FUNCTION  PPI.PPE_OBTENER_ACUMULADO_X_APORTE
RETURN PPE_ACUMULADO_APORTE_TABLE_TYPE PIPELINED AS

BEGIN
    FOR REC IN (
        SELECT 
            DISTINCT
            MPAP.APORTE_ESTRATEGICO                                         APORTE_ESTRATEGICO,
            CAN_APO.CANTIDAD_APORTES                                        CANTIDAD_APORTES_X_ACCION,
            (1 / CAN_APO.CANTIDAD_APORTES)                                  REPRESENTATIVIDAD,
            APD.DISTRIBUCION_1                                              DISTRIBUCION_1,
            APD.DISTRIBUCION_2                                              DISTRIBUCION_2,
            APD.DISTRIBUCION_3                                              DISTRIBUCION_3,
            APD.DISTRIBUCION_4                                              DISTRIBUCION_4,
            APD.DISTRIBUCION_5                                              DISTRIBUCION_5,
            APD.DISTRIBUCION_1*(1 / CAN_APO.CANTIDAD_APORTES)               PROGRAMACION_1,
            APD.DISTRIBUCION_2*(1 / CAN_APO.CANTIDAD_APORTES)               PROGRAMACION_2,
            APD.DISTRIBUCION_3*(1 / CAN_APO.CANTIDAD_APORTES)               PROGRAMACION_3,
            APD.DISTRIBUCION_4*(1 / CAN_APO.CANTIDAD_APORTES)               PROGRAMACION_4,
            APD.DISTRIBUCION_5*(1 / CAN_APO.CANTIDAD_APORTES)               PROGRAMACION_5,
            PROMEDIOS.PROMEDIO_1                                            PROMEDIO_1,
            PROMEDIOS.PROMEDIO_2                                            PROMEDIO_2,
            PROMEDIOS.PROMEDIO_3                                            PROMEDIO_3,
            PROMEDIOS.PROMEDIO_4                                            PROMEDIO_4,
            PROMEDIOS.PROMEDIO_5                                            PROMEDIO_5,
            NVL(((APD.DISTRIBUCION_1*(1 / CAN_APO.CANTIDAD_APORTES)*PROMEDIOS.PROMEDIO_1)/100),0)  EJECUCION_1,
            NVL(((APD.DISTRIBUCION_2*(1 / CAN_APO.CANTIDAD_APORTES)*PROMEDIOS.PROMEDIO_2)/100),0)  EJECUCION_2,
            NVL(((APD.DISTRIBUCION_3*(1 / CAN_APO.CANTIDAD_APORTES)*PROMEDIOS.PROMEDIO_3)/100),0)  EJECUCION_3,
            NVL(((APD.DISTRIBUCION_4*(1 / CAN_APO.CANTIDAD_APORTES)*PROMEDIOS.PROMEDIO_4)/100),0)  EJECUCION_4,
            NVL(((APD.DISTRIBUCION_5*(1 / CAN_APO.CANTIDAD_APORTES)*PROMEDIOS.PROMEDIO_5)/100),0)  EJECUCION_5,
            (
                NVL(((APD.DISTRIBUCION_1*(1 / CAN_APO.CANTIDAD_APORTES)*PROMEDIOS.PROMEDIO_1)/100),0) +
                NVL(((APD.DISTRIBUCION_2*(1 / CAN_APO.CANTIDAD_APORTES)*PROMEDIOS.PROMEDIO_2)/100),0) +
                NVL(((APD.DISTRIBUCION_3*(1 / CAN_APO.CANTIDAD_APORTES)*PROMEDIOS.PROMEDIO_3)/100),0) +
                NVL(((APD.DISTRIBUCION_4*(1 / CAN_APO.CANTIDAD_APORTES)*PROMEDIOS.PROMEDIO_4)/100),0) +
                NVL(((APD.DISTRIBUCION_5*(1 / CAN_APO.CANTIDAD_APORTES)*PROMEDIOS.PROMEDIO_5)/100),0)
            ) AS ACUMULADO_APORTE
        FROM 
        META_POA_APORTE MPAP
        INNER JOIN (SELECT * FROM TABLE(PPI.PPE_OBTENER_METAS_OPE_FUNCIONALES())) METAS_FUNCIONALES on MPAP.META_POA = METAS_FUNCIONALES.META_POA
        INNER JOIN APORTE_ESTRATEGICO           APE ON (APE.ID_APORTE_ESTRATEGICO = MPAP.APORTE_ESTRATEGICO)
        INNER JOIN ACCION_ESTRATEGICA           ACE ON (ACE.ID_ACCION_ESTRATEGICA = APE.ACCION_ESTRATEGICA)
        INNER JOIN (SELECT ACCION_ESTRATEGICA, COUNT(*) AS CANTIDAD_APORTES FROM PPI.APORTE_ESTRATEGICO GROUP BY ACCION_ESTRATEGICA) CAN_APO ON CAN_APO.ACCION_ESTRATEGICA = ACE.ID_ACCION_ESTRATEGICA
        
        -- DISTRIBUCION PORCENTUAL
        INNER JOIN (
            SELECT * FROM TABLE(PPI.PPE_OBTENER_APD_X_APORTE())
        ) APD ON APE.ID_APORTE_ESTRATEGICO = APD.APORTE_ESTRATEGICO
        
        -- PROMEDIOS
        INNER JOIN (
            SELECT * FROM TABLE(PPI.PPE_OBTENER_PROMEDIOS_X_APORTE())
        ) PROMEDIOS ON APE.ID_APORTE_ESTRATEGICO = PROMEDIOS.APORTE_ESTRATEGICO
        
        
        ORDER BY
        MPAP.APORTE_ESTRATEGICO
    ) LOOP
        PIPE ROW (PPE_ACUMULADO_APORTE_TYPE(
                        REC.APORTE_ESTRATEGICO,
                        REC.CANTIDAD_APORTES_X_ACCION,
                        REC.REPRESENTATIVIDAD,
                        REC.DISTRIBUCION_1,
                        REC.DISTRIBUCION_2,
                        REC.DISTRIBUCION_3,
                        REC.DISTRIBUCION_4,
                        REC.DISTRIBUCION_5,
                        REC.PROGRAMACION_1,
                        REC.PROGRAMACION_2,
                        REC.PROGRAMACION_3,
                        REC.PROGRAMACION_4,
                        REC.PROGRAMACION_5,
                        REC.PROMEDIO_1,
                        REC.PROMEDIO_2,
                        REC.PROMEDIO_3,
                        REC.PROMEDIO_4,
                        REC.PROMEDIO_5,
                        REC.EJECUCION_1,
                        REC.EJECUCION_2,
                        REC.EJECUCION_3,
                        REC.EJECUCION_4,
                        REC.EJECUCION_5,
                        REC.ACUMULADO_APORTE
                 ));
    END LOOP;

    RETURN;

END PPE_OBTENER_ACUMULADO_X_APORTE;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 04: GRANTS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++

--***********************************************
-- GRANT'S
--***********************************************
GRANT EXECUTE ON  PPI.PPE_OBTENER_ACUMULADO_X_APORTE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 05: CONSULTAR DATOS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
SELECT * FROM TABLE(PPI.PPE_OBTENER_ACUMULADO_X_APORTE());

FUNCION: PPE_OBTENER_ACUMULADO_X_ACCION

--*******************************************************************************
--*******************************************************************************
-- FUNCIÓN: PPE_OBTENER_ACUMULADO_X_ACCION
--*******************************************************************************
--*******************************************************************************

--+++++++++++++++++++++++++++++++++++++++++++++++++++++
-- PASO 0: ELIMINACIÓN DE DATOS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
DROP TYPE PPI.PPE_ACUMULADO_ACCION_TABLE_TYPE;
DROP TYPE PPI.PPE_ACUMULADO_ACCION_TYPE;
DROP FUNCTION PPI.PPE_OBTENER_ACUMULADO_X_ACCION;



--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 01: Crear TIPO de tipo de dato APD_TYPE
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE TYPE PPI.PPE_ACUMULADO_ACCION_TYPE AS OBJECT (
    ACCION_ESTRATEGICA          NUMBER,
    ACUMULADO_ACCION            NUMBER
);

GRANT EXECUTE ON PPI.PPE_ACUMULADO_ACCION_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 02: Crear TABLA de tipo de dato PROGRAMACION_TYPE
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE TYPE PPI.PPE_ACUMULADO_ACCION_TABLE_TYPE AS TABLE OF PPE_ACUMULADO_ACCION_TYPE;

GRANT EXECUTE ON PPI.PPE_ACUMULADO_ACCION_TABLE_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 03: Crear FUNCIÓN
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE FUNCTION  PPI.PPE_OBTENER_ACUMULADO_X_ACCION
RETURN PPE_ACUMULADO_ACCION_TABLE_TYPE PIPELINED AS

BEGIN

    FOR REC IN (
            SELECT 
              ACE.ID_ACCION_ESTRATEGICA ACCION_ESTRATEGICA,
              SUM(ACUMULADO.ACUMULADO_APORTE) ACUMULADO_ACCION
            FROM 
              ACCION_ESTRATEGICA ACE
            INNER JOIN 
              APORTE_ESTRATEGICO APE ON (APE.ACCION_ESTRATEGICA = ACE.ID_ACCION_ESTRATEGICA)
            -- ACUMULADO
            INNER JOIN (
                SELECT * FROM TABLE(PPI.PPE_OBTENER_ACUMULADO_X_APORTE())
            ) ACUMULADO ON APE.ID_APORTE_ESTRATEGICO = ACUMULADO.APORTE_ESTRATEGICO
            GROUP BY 
              ACE.ID_ACCION_ESTRATEGICA
            ORDER BY 
              ACE.ID_ACCION_ESTRATEGICA
    ) 
    LOOP
    PIPE ROW (PPE_ACUMULADO_ACCION_TYPE(rec.ACCION_ESTRATEGICA,rec.ACUMULADO_ACCION));
   END LOOP;

    --DBMS_OUTPUT.PUT_LINE('DEBUG: periodoAnual: ' || periodoAnual);
    
    RETURN;

END PPE_OBTENER_ACUMULADO_X_ACCION;



--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 04: GRANTS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++

--***********************************************
-- GRANT'S
--***********************************************
GRANT EXECUTE ON  PPI.PPE_OBTENER_ACUMULADO_X_ACCION TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 05: CONSULTAR DATOS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
SELECT * FROM TABLE(PPI.PPE_OBTENER_ACUMULADO_X_ACCION());

FUNCION: PPE_OBTENER_ACUMULADO_X_METAPMP

--*******************************************************************************
--*******************************************************************************
-- FUNCIÓN: PPE_OBTENER_ACUMULADO_X_METAPMP
--*******************************************************************************
--*******************************************************************************

--+++++++++++++++++++++++++++++++++++++++++++++++++++++
-- PASO 0: ELIMINACIÓN DE DATOS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
DROP TYPE PPI.PPE_ACUMULADO_METAPMP_TABLE_TYPE;
DROP TYPE PPI.PPE_ACUMULADO_METAPMP_TYPE;
DROP FUNCTION PPI.PPE_OBTENER_ACUMULADO_X_METAPMP;



--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 01: Crear TIPO de tipo de dato APD_TYPE
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE TYPE PPI.PPE_ACUMULADO_METAPMP_TYPE AS OBJECT (
    META_PMP                    NUMBER,
    ACUMULADO_METAPMP           NUMBER
);

GRANT EXECUTE ON PPI.PPE_ACUMULADO_METAPMP_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 02: Crear TABLA de tipo de dato PROGRAMACION_TYPE
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE TYPE PPI.PPE_ACUMULADO_METAPMP_TABLE_TYPE AS TABLE OF PPE_ACUMULADO_METAPMP_TYPE;

GRANT EXECUTE ON PPI.PPE_ACUMULADO_METAPMP_TABLE_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 03: Crear FUNCIÓN
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE FUNCTION  PPI.PPE_OBTENER_ACUMULADO_X_METAPMP
RETURN PPE_ACUMULADO_METAPMP_TABLE_TYPE PIPELINED AS

BEGIN

    FOR REC IN (
            SELECT 
              MPMP.ID_META_PMP META_PMP,
              NVL(AVG(ACUMULADO_ACCION.ACUMULADO_ACCION),0) AS ACUMULADO_META
            FROM 
            META_PMP MPMP
            INNER JOIN ACCION_ESTRATEGICA ACE ON (ACE.META_PMP = MPMP.ID_META_PMP)
            --ACUMULADO ACCION
            INNER JOIN (
                SELECT * FROM TABLE(PPI.PPE_OBTENER_ACUMULADO_X_ACCION())
            ) ACUMULADO_ACCION ON ACE.ID_ACCION_ESTRATEGICA = ACUMULADO_ACCION.ACCION_ESTRATEGICA
            
            GROUP BY 
              MPMP.ID_META_PMP
            ORDER BY
            MPMP.ID_META_PMP
    ) 
    LOOP
    PIPE ROW (PPE_ACUMULADO_METAPMP_TYPE(rec.META_PMP,rec.ACUMULADO_META));
   END LOOP;

    --DBMS_OUTPUT.PUT_LINE('DEBUG: periodoAnual: ' || periodoAnual);
    
    RETURN;

END PPE_OBTENER_ACUMULADO_X_METAPMP;



--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 04: GRANTS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++

--***********************************************
-- GRANT'S
--***********************************************
GRANT EXECUTE ON  PPI.PPE_OBTENER_ACUMULADO_X_METAPMP TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 05: CONSULTAR DATOS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
SELECT * FROM TABLE(PPI.PPE_OBTENER_ACUMULADO_X_METAPMP());

FUNCION: PPE_OBTENER_ACUMULADO_X_PRIORIDAD

--*******************************************************************************
--*******************************************************************************
-- FUNCIÓN: PPE_OBTENER_ACUMULADO_X_PRIORIDAD
--*******************************************************************************
--*******************************************************************************

--+++++++++++++++++++++++++++++++++++++++++++++++++++++
-- PASO 0: ELIMINACIÓN DE DATOS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
DROP TYPE PPI.PPE_ACUMULADO_PRIORIDAD_TABLE_TYPE;
DROP TYPE PPI.PPE_ACUMULADO_PRIORIDAD_TYPE;
DROP FUNCTION PPI.PPE_OBTENER_ACUMULADO_X_PRIORIDAD;



--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 01: Crear TIPO de tipo de dato APD_TYPE
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE TYPE PPI.PPE_ACUMULADO_PRIORIDAD_TYPE AS OBJECT (
    PRIORIDAD_ESTRATEGICA_PMP                    NUMBER,
    ACUMULADO_PRIORIDAD                          NUMBER
);

GRANT EXECUTE ON PPI.PPE_ACUMULADO_PRIORIDAD_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 02: Crear TABLA de tipo de dato
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE TYPE PPI.PPE_ACUMULADO_PRIORIDAD_TABLE_TYPE AS TABLE OF PPE_ACUMULADO_PRIORIDAD_TYPE;

GRANT EXECUTE ON PPI.PPE_ACUMULADO_PRIORIDAD_TABLE_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 03: Crear FUNCIÓN
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE FUNCTION  PPI.PPE_OBTENER_ACUMULADO_X_PRIORIDAD
RETURN PPE_ACUMULADO_PRIORIDAD_TABLE_TYPE PIPELINED AS

BEGIN

    FOR REC IN (
            SELECT 
                PEPMP.ID_PRIORIDAD_ESTRATEGICA_PMP PRIORIDAD_ESTRATEGICA_PMP,
                NVL(AVG(ACUMULADO_METAPMP.ACUMULADO_METAPMP),0) AS ACUMULADO_PRIORIDAD
            FROM 
            PRIORIDAD_ESTRATEGICA_PMP PEPMP
            INNER JOIN DETALLE_PMP DPMP ON (DPMP.PRIORIDAD_ESTRATEGICA_PMP = PEPMP.ID_PRIORIDAD_ESTRATEGICA_PMP)
            INNER JOIN META_PMP MPMP ON (MPMP.DETALLE_PMP = DPMP.ID_DETALLE_PMP)
            
            --ACUMULADO METAPMP
            INNER JOIN (
                SELECT * FROM TABLE(PPI.PPE_OBTENER_ACUMULADO_X_METAPMP())
            ) ACUMULADO_METAPMP ON MPMP.ID_META_PMP = ACUMULADO_METAPMP.META_PMP
            GROUP BY 
              PEPMP.ID_PRIORIDAD_ESTRATEGICA_PMP
            ORDER BY
            PEPMP.ID_PRIORIDAD_ESTRATEGICA_PMP
    ) 
    LOOP
    PIPE ROW (PPE_ACUMULADO_PRIORIDAD_TYPE(REC.PRIORIDAD_ESTRATEGICA_PMP,REC.ACUMULADO_PRIORIDAD));
   END LOOP;

    --DBMS_OUTPUT.PUT_LINE('DEBUG: periodoAnual: ' || periodoAnual);
    
    RETURN;

END PPE_OBTENER_ACUMULADO_X_PRIORIDAD;



--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 04: GRANTS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++

--***********************************************
-- GRANT'S
--***********************************************
GRANT EXECUTE ON  PPI.PPE_OBTENER_ACUMULADO_X_PRIORIDAD TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 05: CONSULTAR DATOS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
SELECT * FROM TABLE(PPI.PPE_OBTENER_ACUMULADO_X_PRIORIDAD());

FUNCION: PPE_OBTENER_AVANCE_PLP

--*******************************************************************************
--*******************************************************************************
-- FUNCIÓN: PPE_OBTENER_AVANCE_PLP
--*******************************************************************************
--*******************************************************************************

--+++++++++++++++++++++++++++++++++++++++++++++++++++++
-- PASO 0: ELIMINACIÓN DE DATOS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
DROP TYPE PPI.PPE_AVANCE_PLP_TABLE_TYPE;
DROP TYPE PPI.PPE_AVANCE_PLP_TYPE;
DROP FUNCTION PPI.PPE_OBTENER_AVANCE_PLP;



--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 01: Crear TIPO de tipo de dato
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE TYPE PPI.PPE_AVANCE_PLP_TYPE AS OBJECT (
    PERIODO_ANUAL                                   NUMBER,
    PLP_CODIGO                                      VARCHAR2(500),
    EJE_PLP_CODIGO                                  NUMBER,
    EJE_PLP_DESCRIPCION                             VARCHAR2(500),
    OBJ_PLP_CODIGO                                  NUMBER,
    OBJ_PLP_DESCRIPCION                             VARCHAR2(500),
    EJE_TRA_CODIGO                                  NUMBER,
    EJE_TRA_DESCRIPCION                             VARCHAR2(500),
    PRI_PMP_ID                                      NUMBER,
    PRI_PMP_CODIGO                                  NUMBER,
    PRI_PMP_DESCRIPCION                             VARCHAR2(500),
    ACUMULADO_PRIORIDAD                             NUMBER,
    OBJ_PMP_CODIGO                                  NUMBER,
    OBJ_PMP_DESCRIPCION                             VARCHAR2(500),
    MPMP_ID                                         NUMBER,
    MPMP_CODIGO                                     NUMBER,
    MPMP_DESCRIPCION                                VARCHAR2(500),
    ACUMULADO_METAPMP                               NUMBER,
    AMBITO_ACCION_UNIVERITARIA                      VARCHAR2(500),
    ENCARGADO_MONITOERO                             VARCHAR2(500),
    EPES_CODIGO                                     NUMBER,
    EPES_NOMBRE                                     VARCHAR2(500),
    TEPES_NOMBRE                                    VARCHAR2(500),
    OPDS_CODIGO                                     NUMBER,
    OPDS_NOMBRE                                     VARCHAR2(500),
    UE_PACE_NOMBRE                                  VARCHAR2(500),
    ACE_ID                                          NUMBER,
    ACE_CODIGO                                      NUMBER,
    ACE_DESCRIPCION                                 VARCHAR2(500),
    ACUMULADO_ACCION                                NUMBER,
    UE_PAPE_NOMBRE                                  VARCHAR2(500),
    APE_CODIGO                                      NUMBER,
    APE_DESCRIPCION                                 VARCHAR2(500),
    CUANTIFICACION                                  NUMBER,
    LINEA_BASE                                      NUMBER,
    FUENTE_RECURSO                                  VARCHAR2(500),
    JORNADA                                         NUMBER,
    APE_ID                                          NUMBER,
    CANTIDAD_APORTES_X_ACCION                       NUMBER,
    REPRESENTATIVIDAD                               NUMBER,
    DISTRIBUCION_1                                  NUMBER,
    DISTRIBUCION_2                                  NUMBER,
    DISTRIBUCION_3                                  NUMBER,
    DISTRIBUCION_4                                  NUMBER,
    DISTRIBUCION_5                                  NUMBER,
    PROGRAMACION_1                                  NUMBER,
    PROGRAMACION_2                                  NUMBER,
    PROGRAMACION_3                                  NUMBER,
    PROGRAMACION_4                                  NUMBER,
    PROGRAMACION_5                                  NUMBER,
    PROMEDIO_1                                      NUMBER,
    PROMEDIO_2                                      NUMBER,
    PROMEDIO_3                                      NUMBER,
    PROMEDIO_4                                      NUMBER,
    PROMEDIO_5                                      NUMBER,
    EJECUCION_1                                     NUMBER,
    EJECUCION_2                                     NUMBER,
    EJECUCION_3                                     NUMBER,
    EJECUCION_4                                     NUMBER,
    EJECUCION_5                                     NUMBER,
    ACUMULADO_APORTE                                NUMBER
);


GRANT EXECUTE ON PPI.PPE_AVANCE_PLP_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 02: Crear TABLA de tipo de dato PROGRAMACION_TYPE
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE TYPE PPI.PPE_AVANCE_PLP_TABLE_TYPE AS TABLE OF PPE_AVANCE_PLP_TYPE;

GRANT EXECUTE ON PPI.PPE_AVANCE_PLP_TABLE_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;



--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 03: Crear FUNCIÓN
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE FUNCTION  PPI.PPE_OBTENER_AVANCE_PLP
RETURN PPE_AVANCE_PLP_TABLE_TYPE PIPELINED AS

BEGIN

    FOR REC IN (
        --************************************************************
        -- FUNCION: OBTENER EL AVANCE PLP
        -- VERSION: 1.0.11
        --************************************************************
        SELECT
            DISTINCT
            PO.PERIODO_ANUAL                            PERIODO_ANUAL,
            PLP.CODIGO                                  PLP_CODIGO,
            EJE_PLP.CODIGO                              EJE_PLP_CODIGO,
            EJE_PLP.DESCRIPCION                         EJE_PLP_DESCRIPCION,
            OBJ_PLP.CODIGO                              OBJ_PLP_CODIGO,
            OBJ_PLP.DESCRIPCION                         OBJ_PLP_DESCRIPCION,
            EJE_TRA.CODIGO                              EJE_TRA_CODIGO,
            EJE_TRA.DESCRIPCION                         EJE_TRA_DESCRIPCION,
            PRI_PMP.ID_PRIORIDAD_ESTRATEGICA_PMP        PRI_PMP_ID,
            PRI_PMP.CODIGO                              PRI_PMP_CODIGO,
            PRI_PMP.DESCRIPCION                         PRI_PMP_DESCRIPCION,
            PRIORIDAD.ACUMULADO_PRIORIDAD               ACUMULADO_PRIORIDAD,
            OBJ_PMP.CODIGO                              OBJ_PMP_CODIGO,
            OBJ_PMP.DESCRIPCION                         OBJ_PMP_DESCRIPCION,
            MPMP.ID_META_PMP                            MPMP_ID,
            MPMP.CODIGO                                 MPMP_CODIGO,
            MPMP.DESCRIPCION                            MPMP_DESCRIPCION, 
            METAPMP.ACUMULADO_METAPMP                   ACUMULADO_METAPMP,
            AAU.NOMBRE                                  AMBITO_ACCION_UNIVERITARIA,
            UE_EM.NOMBRE                                ENCARGADO_MONITOERO,
            EPES.CODIGO                                 EPES_CODIGO,
            EPES.NOMBRE                                 EPES_NOMBRE,
            TEPES.NOMBRE                                TEPES_NOMBRE,
            OPDS.CODIGO                                 OPDS_CODIGO,
            OPDS.NOMBRE                                 OPDS_NOMBRE,
            UE_PACE.NOMBRE                              UE_PACE_NOMBRE,
            ACE.ID_ACCION_ESTRATEGICA                   ACE_ID,
            ACE.CODIGO                                  ACE_CODIGO,
            ACE.DESCRIPCION                             ACE_DESCRIPCION,
            ACCION.ACUMULADO_ACCION                     ACUMULADO_ACCION,    
            UE_PAPE.NOMBRE                              UE_PAPE_NOMBRE,
            APE.CODIGO                                  APE_CODIGO,
            APE.DESCRIPCION                             APE_DESCRIPCION,
            APE.CUANTIFICACION                          CUANTIFICACION,
            APE.LINEA_BASE                              LINEA_BASE,
            FR.NOMBRE                                   FUENTE_RECURSO,
            APE.JORNADA                                 JORNADA,
            APE.ID_APORTE_ESTRATEGICO                   APE_ID,
            APORTE.CANTIDAD_APORTES_X_ACCION            CANTIDAD_APORTES_X_ACCION,
            APORTE.REPRESENTATIVIDAD                    REPRESENTATIVIDAD,
            APORTE.DISTRIBUCION_1                       DISTRIBUCION_1,
            APORTE.DISTRIBUCION_2                       DISTRIBUCION_2,
            APORTE.DISTRIBUCION_3                       DISTRIBUCION_3,
            APORTE.DISTRIBUCION_4                       DISTRIBUCION_4,
            APORTE.DISTRIBUCION_5                       DISTRIBUCION_5,
            APORTE.PROGRAMACION_1                       PROGRAMACION_1,
            APORTE.PROGRAMACION_2                       PROGRAMACION_2,
            APORTE.PROGRAMACION_3                       PROGRAMACION_3,
            APORTE.PROGRAMACION_4                       PROGRAMACION_4,
            APORTE.PROGRAMACION_5                       PROGRAMACION_5,
            APORTE.PROMEDIO_1                           PROMEDIO_1,
            APORTE.PROMEDIO_2                           PROMEDIO_2,
            APORTE.PROMEDIO_3                           PROMEDIO_3,
            APORTE.PROMEDIO_4                           PROMEDIO_4,
            APORTE.PROMEDIO_5                           PROMEDIO_5,
            APORTE.EJECUCION_1                          EJECUCION_1,
            APORTE.EJECUCION_2                          EJECUCION_2,
            APORTE.EJECUCION_3                          EJECUCION_3,
            APORTE.EJECUCION_4                          EJECUCION_4,
            APORTE.EJECUCION_5                          EJECUCION_5,
            APORTE.ACUMULADO_APORTE                     ACUMULADO_APORTE
        FROM 
        META_POA_EVALUACION                         MPE
        INNER JOIN META_POA                         MP          ON (MP.ID_META_POA                          =   MPE.META_POA)
        INNER JOIN OBJETIVO_POA                     OP          ON (OP.ID_OBJETIVO_POA                      =   MP.OBJETIVO_POA)
        INNER JOIN PLAN_OPERATIVO                   PO          ON (PO.ID_PLAN_OPERATIVO                    =   OP.PLAN_OPERATIVO)
        INNER JOIN UNIDAD_EJECUTORA                 UE_PO       ON (UE_PO.ID_UNIDAD_EJECUTORA               =   PO.UNIDAD_EJECUTORA)
        INNER JOIN EVALUACION_OPERATIVA             EO          ON (EO.PLAN_OPERATIVO                       =   PO.ID_PLAN_OPERATIVO)
        INNER JOIN META_POA_APORTE                  MPA         ON (MPA.META_POA                            =   MP.ID_META_POA)
        INNER JOIN APORTE_ESTRATEGICO               APE         ON (APE.ID_APORTE_ESTRATEGICO               =   MPA.APORTE_ESTRATEGICO)
        INNER JOIN PLAN_APORTE_ESTRATEGICO          PAPE        ON (PAPE.ID_PLAN_APORTE_ESTRATEGICO         =   APE.PLAN_APORTE_ESTRATEGICO)
        INNER JOIN UNIDAD_EJECUTORA                 UE_PAPE     ON (UE_PAPE.ID_UNIDAD_EJECUTORA             =   PAPE.UNIDAD_EJECUTORA)
        LEFT JOIN  APORTE_PAE_FUENTE_RECURSO        APAEFR      ON (APAEFR.APORTE_ESTRATEGICO               =   APE.ID_APORTE_ESTRATEGICO) --FALTAN
        LEFT JOIN  FUENTE_RECURSO                   FR          ON (FR.ID_FUENTE_RECURSO                    =   APAEFR.FUENTE_RECURSO) --FALTAN
        INNER JOIN ACCION_ESTRATEGICA               ACE         ON (ACE.ID_ACCION_ESTRATEGICA               =   APE.ACCION_ESTRATEGICA)
        INNER JOIN PLAN_ACCION_ESTRATEGICA          PACE        ON (PACE.ID_PLAN_ACCION_ESTRATEGICA         =   ACE.PLAN_ACCION_ESTRATEGICA)
        INNER JOIN UNIDAD_EJECUTORA                 UE_PACE     ON (UE_PACE.ID_UNIDAD_EJECUTORA             =   PACE.UNIDAD_EJECUTORA)
        INNER JOIN META_PMP                         MPMP        ON (MPMP.ID_META_PMP                        =   ACE.META_PMP)
        INNER JOIN AMBITO_ACCION_UNIVERSITARIA      AAU         ON (AAU.ID_AMBITO_ACCION_UNIVERSITARIA      =   MPMP.AMBITO_ACCION_UNIVERSITARIA)
        INNER JOIN ENCARGADO_MONITOREO              EM          ON (EM.ID_ENCARGADO_MONITOREO               =   MPMP.ENCARGADO_MONITOREO)
        INNER JOIN UNIDAD_EJECUTORA                 UE_EM       ON (UE_EM.ID_UNIDAD_EJECUTORA               =   EM.UNIDAD_EJECUTORA)
        LEFT  JOIN META_PMP_EJE_PES                 MPEP        ON (MPEP.META_PMP                           =   MPMP.ID_META_PMP) --VACIA
        LEFT  JOIN EJE_PES                          EPES        ON (EPES.ID_EJE_PES                         =   MPEP.EJE_PES)
        LEFT  JOIN TIPO_EJE_PES                     TEPES       ON (TEPES.ID_TIPO_EJE_PES                   =   EPES.TIPO_EJE_PES)
        LEFT  JOIN META_PMP_OBJETIVO_PDS            MPOPDS      ON (MPOPDS.META_PMP                         =   MPMP.ID_META_PMP) --VACIA
        LEFT  JOIN OBJETIVO_PDS                     OPDS        ON (OPDS.ID_OBJETIVO_PDS                    =   MPOPDS.OBJETIVO_PDS)
        INNER JOIN DETALLE_PMP                      DET_PMP     ON (DET_PMP.ID_DETALLE_PMP                  =   MPMP.DETALLE_PMP)
        INNER JOIN PRIORIDAD_ESTRATEGICA_PMP        PRI_PMP     ON (PRI_PMP.ID_PRIORIDAD_ESTRATEGICA_PMP    =   DET_PMP.PRIORIDAD_ESTRATEGICA_PMP)
        INNER JOIN OBJETIVO_ESTRATEGICO_PMP         OBJ_PMP     ON (OBJ_PMP.ID_OBJETIVO_ESTRATEGICO_PMP     =   DET_PMP.OBJETIVO_ESTRATEGICO_PMP)
        INNER JOIN EJE_ESTRATEGICO_PLP              EJE_PLP     ON (EJE_PLP.ID_EJE_ESTRATEGICO_PLP          =   DET_PMP.EJE_ESTRATEGICO_LARGO_PLAZO)
        INNER JOIN DETALLE_PLP                      DET_PLP     ON (DET_PLP.EJE_ESTRATEGICO_PLP             =   EJE_PLP.ID_EJE_ESTRATEGICO_PLP)   
        INNER JOIN OBJETIVO_ESTRATEGICO_PLP         OBJ_PLP     ON (OBJ_PLP.ID_OBJETIVO_ESTRATEGICO_PLP     =   DET_PLP.OBJETIVO_ESTRATEGICO_PLP)
        INNER JOIN DETALLE_PLP_EJE_TRANSVERSAL      DET_EJE_TRA ON (DET_EJE_TRA.DETALLE_PLP                 =   DET_PLP.ID_DETALLE_PLP)
        LEFT  JOIN EJE_TRANSVERSAL_PLP              EJE_TRA     ON (EJE_TRA.ID_EJE_TRANSVERSAL_PLP          =   DET_EJE_TRA.EJE_TRANSVERSAL_PLP) --VACIA
        INNER JOIN PLAN_LARGO_PLAZO                 PLP         ON (PLP.ID_PLAN_LARGO_PLAZO                 =   DET_PLP.PLAN_LARGO_PLAZO)
        
        --METAS FUNCIONALES
        INNER JOIN (SELECT *
                FROM TABLE(PPI.PPE_OBTENER_METAS_OPE_FUNCIONALES())
        ) METAS_FUNCIONALES on MPE.META_POA = METAS_FUNCIONALES.META_POA AND METAS_FUNCIONALES.PERIODO_ANUAL = PO.PERIODO_ANUAL
        
        --AVANCE APORTE
        INNER JOIN (SELECT *
                FROM TABLE(PPI.PPE_OBTENER_ACUMULADO_X_APORTE())
        ) APORTE ON APE.ID_APORTE_ESTRATEGICO = APORTE.APORTE_ESTRATEGICO
        
        --AVANCE ACCION
        INNER JOIN (SELECT *
                FROM TABLE(PPI.PPE_OBTENER_ACUMULADO_X_ACCION())
        ) ACCION ON ACE.ID_ACCION_ESTRATEGICA = ACCION.ACCION_ESTRATEGICA
        
        --AVANCE METAPMP
        INNER JOIN (SELECT *
                FROM TABLE(PPI.PPE_OBTENER_ACUMULADO_X_METAPMP())
        ) METAPMP ON MPMP.ID_META_PMP = METAPMP.META_PMP
        
        --AVANCE PRIORIDAD
        INNER JOIN (SELECT *
                FROM TABLE(PPI.PPE_OBTENER_ACUMULADO_X_PRIORIDAD())
        ) PRIORIDAD ON PRI_PMP.ID_PRIORIDAD_ESTRATEGICA_PMP = PRIORIDAD.PRIORIDAD_ESTRATEGICA_PMP
        
        
        WHERE 
        
        MPE.ETAPA_PLAN = (
            SELECT
                EP.ID_ETAPA_PLAN
            FROM ETAPA_PLAN EP
            WHERE
            EP.TIPO_ETAPA = (SELECT VALOR FROM PARAMETRO WHERE LLAVE = 'param_ppi_ppo_tipoEtapa_evaluacion')
            AND EP.PERIODO_ANUAL = PO.PERIODO_ANUAL
            AND EP.TIPO_PLAN_OPERATIVO = (SELECT VALOR FROM PARAMETRO WHERE LLAVE = 'param_ppi_ppo_tipoPlanOperativo_unidad')
            AND EP.FECHA_FINAL_EVALUACION <= TRUNC(SYSDATE)
            ORDER BY
            EP.FECHA_FINAL_EVALUACION DESC
            FETCH FIRST 1 ROW ONLY
        
        )
        ORDER BY 
        EJE_PLP.CODIGO,
        OBJ_PLP.CODIGO,
        EJE_TRA.CODIGO,
        PRI_PMP.CODIGO,
        OBJ_PMP.CODIGO,
        MPMP.CODIGO,
        AAU.NOMBRE,
        UE_EM.NOMBRE,
        EPES.CODIGO,
        OPDS.CODIGO,
        UE_PACE.NOMBRE,
        ACE.CODIGO,
        UE_PAPE.NOMBRE,
        APE.CODIGO


     
    ) 
    LOOP
    PIPE ROW (PPE_AVANCE_PLP_TYPE(
                                REC.PERIODO_ANUAL,
                                REC.PLP_CODIGO,
                                REC.EJE_PLP_CODIGO,
                                REC.EJE_PLP_DESCRIPCION,
                                REC.OBJ_PLP_CODIGO,
                                REC.OBJ_PLP_DESCRIPCION,
                                REC.EJE_TRA_CODIGO,
                                REC.EJE_TRA_DESCRIPCION,
                                REC.PRI_PMP_ID,
                                REC.PRI_PMP_CODIGO,
                                REC.PRI_PMP_DESCRIPCION,
                                REC.ACUMULADO_PRIORIDAD,
                                REC.OBJ_PMP_CODIGO,
                                REC.OBJ_PMP_DESCRIPCION,
                                REC.MPMP_ID,
                                REC.MPMP_CODIGO,
                                REC.MPMP_DESCRIPCION,
                                REC.ACUMULADO_METAPMP,
                                REC.AMBITO_ACCION_UNIVERITARIA,
                                REC.ENCARGADO_MONITOERO,
                                REC.EPES_CODIGO,
                                REC.EPES_NOMBRE,
                                REC.TEPES_NOMBRE,
                                REC.OPDS_CODIGO,
                                REC.OPDS_NOMBRE,
                                REC.UE_PACE_NOMBRE,
                                REC.ACE_ID,
                                REC.ACE_CODIGO,
                                REC.ACE_DESCRIPCION,
                                REC.ACUMULADO_ACCION,
                                REC.UE_PAPE_NOMBRE,
                                REC.APE_CODIGO,
                                REC.APE_DESCRIPCION,
                                REC.CUANTIFICACION,
                                REC.LINEA_BASE,
                                REC.FUENTE_RECURSO,
                                REC.JORNADA,
                                REC.APE_ID,
                                REC.CANTIDAD_APORTES_X_ACCION,
                                REC.REPRESENTATIVIDAD,
                                REC.DISTRIBUCION_1,
                                REC.DISTRIBUCION_2,
                                REC.DISTRIBUCION_3,
                                REC.DISTRIBUCION_4,
                                REC.DISTRIBUCION_5,
                                REC.PROGRAMACION_1,
                                REC.PROGRAMACION_2,
                                REC.PROGRAMACION_3,
                                REC.PROGRAMACION_4,
                                REC.PROGRAMACION_5,
                                REC.PROMEDIO_1,
                                REC.PROMEDIO_2,
                                REC.PROMEDIO_3,
                                REC.PROMEDIO_4,
                                REC.PROMEDIO_5,
                                REC.EJECUCION_1,
                                REC.EJECUCION_2,
                                REC.EJECUCION_3,
                                REC.EJECUCION_4,
                                REC.EJECUCION_5,
                                REC.ACUMULADO_APORTE
                             ));
   END LOOP;

    --DBMS_OUTPUT.PUT_LINE('DEBUG: periodoAnual: ' || periodoAnual);
    
    RETURN;

END PPE_OBTENER_AVANCE_PLP;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 04: GRANTS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++

--***********************************************
-- GRANT'S
--***********************************************
GRANT EXECUTE ON  PPI.PPE_OBTENER_AVANCE_PLP TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 05: CONSULTAR DATOS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
SELECT * FROM TABLE(PPI.PPE_OBTENER_AVANCE_PLP()) AVANCE_PLP;

Parte II: Creación de Vista

NOTA IMPORTANTE: las vista no llevan parámetros obtienen todos los datos a nivel de código se filtran

  • Con base en la funciones anteriores tenemos la consulta
SELECT
PERIODO_ANUAL,
PLP_CODIGO,
EJE_PLP_CODIGO,
EJE_PLP_DESCRIPCION,
OBJ_PLP_CODIGO,
OBJ_PLP_DESCRIPCION,
EJE_TRA_CODIGO,
EJE_TRA_DESCRIPCION,
PRI_PMP_ID,
PRI_PMP_CODIGO,
PRI_PMP_DESCRIPCION,
ACUMULADO_PRIORIDAD,
OBJ_PMP_CODIGO,
OBJ_PMP_DESCRIPCION,
MPMP_ID,
MPMP_CODIGO,
MPMP_DESCRIPCION, 
ACUMULADO_METAPMP,
AMBITO_ACCION_UNIVERITARIA,
ENCARGADO_MONITOERO,
EPES_CODIGO,
EPES_NOMBRE,
TEPES_NOMBRE,
OPDS_CODIGO,
OPDS_NOMBRE,
UE_PACE_NOMBRE,
ACE_ID,
ACE_CODIGO,
ACE_DESCRIPCION,
ACUMULADO_ACCION,    
UE_PAPE_NOMBRE,
APE_CODIGO,
APE_DESCRIPCION,
CUANTIFICACION,
LINEA_BASE,
FUENTE_RECURSO,
JORNADA,
APE_ID,
CANTIDAD_APORTES_X_ACCION,
REPRESENTATIVIDAD,
DISTRIBUCION_1,
DISTRIBUCION_2,
DISTRIBUCION_3,
DISTRIBUCION_4,
DISTRIBUCION_5,
PROGRAMACION_1,
PROGRAMACION_2,
PROGRAMACION_3,
PROGRAMACION_4,
PROGRAMACION_5,
PROMEDIO_1,
PROMEDIO_2,
PROMEDIO_3,
PROMEDIO_4,
PROMEDIO_5,
EJECUCION_1,
EJECUCION_2,
EJECUCION_3,
EJECUCION_4,
EJECUCION_5,
ACUMULADO_APORTE
FROM TABLE(PPI.PPE_OBTENER_AVANCE_PLP()) AVANCE_PLP;

Notas:

  • Esta consultta ya trae el campo necesario para el filtrado
PERIODO_ANUAL,
  • Ahora la vamos a modificar para que contenga el numero de fila como ID ya que es requerido para las vista
ROWNUM                              AS ID,
  • Quedando así
SELECT
ROWNUM AS ID,
PERIODO_ANUAL,
PLP_CODIGO,
EJE_PLP_CODIGO,
EJE_PLP_DESCRIPCION,
OBJ_PLP_CODIGO,
OBJ_PLP_DESCRIPCION,
EJE_TRA_CODIGO,
EJE_TRA_DESCRIPCION,
PRI_PMP_ID,
PRI_PMP_CODIGO,
PRI_PMP_DESCRIPCION,
ACUMULADO_PRIORIDAD,
OBJ_PMP_CODIGO,
OBJ_PMP_DESCRIPCION,
MPMP_ID,
MPMP_CODIGO,
MPMP_DESCRIPCION, 
ACUMULADO_METAPMP,
AMBITO_ACCION_UNIVERITARIA,
ENCARGADO_MONITOERO,
EPES_CODIGO,
EPES_NOMBRE,
TEPES_NOMBRE,
OPDS_CODIGO,
OPDS_NOMBRE,
UE_PACE_NOMBRE,
ACE_ID,
ACE_CODIGO,
ACE_DESCRIPCION,
ACUMULADO_ACCION,    
UE_PAPE_NOMBRE,
APE_CODIGO,
APE_DESCRIPCION,
CUANTIFICACION,
LINEA_BASE,
FUENTE_RECURSO,
JORNADA,
APE_ID,
CANTIDAD_APORTES_X_ACCION,
REPRESENTATIVIDAD,
DISTRIBUCION_1,
DISTRIBUCION_2,
DISTRIBUCION_3,
DISTRIBUCION_4,
DISTRIBUCION_5,
PROGRAMACION_1,
PROGRAMACION_2,
PROGRAMACION_3,
PROGRAMACION_4,
PROGRAMACION_5,
PROMEDIO_1,
PROMEDIO_2,
PROMEDIO_3,
PROMEDIO_4,
PROMEDIO_5,
EJECUCION_1,
EJECUCION_2,
EJECUCION_3,
EJECUCION_4,
EJECUCION_5,
ACUMULADO_APORTE
FROM TABLE(PPI.PPE_OBTENER_AVANCE_PLP()) AVANCE_PLP;

VistaAvancePLPCreate.sql

  • Ahora debemos crear el siguiente archivo
  • Ubicación: PPI-PPE-> service -> src -> main -> resources -> sql
  • Para almacenar el respaldo de la creación de la vista
  • Le agregamos
/* 
 * Copyright (C) 2022.
 *
 * Centro de Gestion Informatica
 * Direccion de Tecnologias de la Informacion y Comunicacion
 * Universidad Nacional - Costa Rica
 * http://www.una.ac.cr
 * 
 */

/********************************************************/
/********************************************************/
/* DOCUMENTACIÓN                                        */
/********************************************************/
/********************************************************/
/**
 * @author:  Gustavo Matamoros González
 * @since: 06/12/2023
 * @bug: BTPPI-342 
 * @funcion: Obtener el avance del Plan de Largo PLazo (PLP)
 */

/********************************************************/
/********************************************************/
/* ELIMINAR LA VISTA                                    */
/********************************************************/
/********************************************************/
DROP PUBLIC SYNONYM VISTA_AVANCE_PLP;

DROP VIEW PPI.VISTA_AVANCE_PLP;


/********************************************************/
/********************************************************/
/* CREACIÓN DE LA VISTA                                 */
/********************************************************/
/********************************************************/
CREATE OR REPLACE FORCE EDITIONABLE VIEW  PPI.VISTA_AVANCE_PLP AS

SELECT
ROWNUM AS ID,
PERIODO_ANUAL,
PLP_CODIGO,
EJE_PLP_CODIGO,
EJE_PLP_DESCRIPCION,
OBJ_PLP_CODIGO,
OBJ_PLP_DESCRIPCION,
EJE_TRA_CODIGO,
EJE_TRA_DESCRIPCION,
PRI_PMP_ID,
PRI_PMP_CODIGO,
PRI_PMP_DESCRIPCION,
ACUMULADO_PRIORIDAD,
OBJ_PMP_CODIGO,
OBJ_PMP_DESCRIPCION,
MPMP_ID,
MPMP_CODIGO,
MPMP_DESCRIPCION, 
ACUMULADO_METAPMP,
AMBITO_ACCION_UNIVERITARIA,
ENCARGADO_MONITOERO,
EPES_CODIGO,
EPES_NOMBRE,
TEPES_NOMBRE,
OPDS_CODIGO,
OPDS_NOMBRE,
UE_PACE_NOMBRE,
ACE_ID,
ACE_CODIGO,
ACE_DESCRIPCION,
ACUMULADO_ACCION,    
UE_PAPE_NOMBRE,
APE_CODIGO,
APE_DESCRIPCION,
CUANTIFICACION,
LINEA_BASE,
FUENTE_RECURSO,
JORNADA,
APE_ID,
CANTIDAD_APORTES_X_ACCION,
REPRESENTATIVIDAD,
DISTRIBUCION_1,
DISTRIBUCION_2,
DISTRIBUCION_3,
DISTRIBUCION_4,
DISTRIBUCION_5,
PROGRAMACION_1,
PROGRAMACION_2,
PROGRAMACION_3,
PROGRAMACION_4,
PROGRAMACION_5,
PROMEDIO_1,
PROMEDIO_2,
PROMEDIO_3,
PROMEDIO_4,
PROMEDIO_5,
EJECUCION_1,
EJECUCION_2,
EJECUCION_3,
EJECUCION_4,
EJECUCION_5,
ACUMULADO_APORTE
FROM TABLE(PPI.PPE_OBTENER_AVANCE_PLP()) AVANCE_PLP;


/********************************************************/
/********************************************************/
/* CREACIÓN DE SINONIMO                                 */
/********************************************************/
/********************************************************/
CREATE PUBLIC SYNONYM VISTA_AVANCE_PLP FOR PPI.VISTA_AVANCE_PLP;


/********************************************************/
/********************************************************/
/* GRANT'S                                              */
/********************************************************/
/********************************************************/
--GRANT WWW_SIGESA / ANALISTA / ANALISTA_SIGESA
GRANT SELECT, REFERENCES ON  PPI.VISTA_AVANCE_PLP TO WWW_SIGESA;
GRANT SELECT ON  PPI.VISTA_AVANCE_PLP TO ANALISTA, ANALISTA_SIGESA;


/********************************************************/
/********************************************************/
/* CONSULTAR VISTA                                      */
/********************************************************/
/********************************************************/
SELECT * FROM VISTA_AVANCE_PLP;

VistaAvancePLPI18n.sql

  • Ahora debemos crear un script que inserte la internacionalización
/* 
 * Copyright (C) 2022.
 *
 * Centro de Gestion Informatica
 * Direccion de Tecnologias de la Informacion y Comunicacion
 * Universidad Nacional - Costa Rica
 * http://www.una.ac.cr
 * 
 */

/********************************************************/
/********************************************************/
/* DOCUMENTACIÓN                                        */
/********************************************************/
/********************************************************/
/**
 * @author:  Gustavo Matamoros González
 * @since: 06/12/2023
 * @bug: BTPPI-342 
 * @funcion: Insertar internacionalización para VISTA_AVANCE_PLP
 */

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_ejeEstrategicoPLPCodigo_header', 'Código Eje Estratégico PLP', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_ejeEstrategicoPLPDescripcion_header', 'Descripción', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_objetivoEstrategicoPLPCodigo_header', 'Código Objetivo Estratégico PLP', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_objetivoEstrategicoPLPDescripcion_header', 'Descripción', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_ejeTransversalPLPCodigo_header', 'Código Eje Transversal PLP', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_ejeTransversalDescripcion_header', 'Descripción', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_prioridadEstrategicaPMPCodigo_header', 'Código Prioridad Estratégica PMP', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_prioridadEstrategicaPMPDescripcion_header', 'Descripción', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_prioridadEstrategicaPMPAvance_header', 'Avance Prioridad Estratégica PMP', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_objetivoEstrategicoPMPCodigo_header', 'Código Objetivo Estratégico PMP', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_objetivoEstrategicoPMPDescripcion_header', 'Descripción', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_metaEstrategicaPMPCodigo_header', 'Código Meta Estratégica PMP', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_metaEstrategicaPMPDescripcion_header', 'Descripción', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_metaEstrategicaPMPAvance_header', 'Avance Meta Estratégica PMP', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_ambitoAccionUniversitaria_header', 'Ámbito de Acción Universitaria', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_encargadoMonitoreo_header', 'Encargado de Monitoreo', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_ejePlanesCodigo_header', 'Código Eje PLANES', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_ejePlanesNombre_header', 'Eje PLANES', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_ejePlanesTipo_header', 'Tipo Eje PLANES', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_objetivoPDSCodigo_header', 'Código Objetivo PDS', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_objetivoPDSNombre_header', 'Objetivo PDS', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_accionEstrategicaUnidadEjecutora_header', 'Unidad Ejecutora de Acción Estratégica', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_accionEstrategicaCodigo_header', 'Código Acción Estratégica', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_accionEstrategicaDescripcion_header', 'Descripción', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_accionEstrategicaAvance_header', 'Avance Acción Estratégica', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_aporteEstrategicoUnidadEjecutora_header', 'Unidad Ejecutora de Aporte Estratégico', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_aporteEstrategicoCodigo_header', 'Código Aporte Estratégico', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_aporteEstrategicoDescripcion_header', 'Descripción', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_aporteEstrategicoCuantificacion_header', 'Cuantificación', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_aporteEstrategicoLineaBase_header', 'Línea Base', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_aporteEstrategicoFuenteRecursos_header', 'Fuente de Recursos', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_aporteEstrategicoJornada_header', 'Jornada', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_aporteEstrategicoCantidadAportesAccion_header', 'Cantidad de Aportes por Acción', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_aporteEstrategicoRepresentatividad_header', 'Representatividad', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_aporteEstrategicoDistribucion1_header', 'Distribucion 1', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_aporteEstrategicoDistribucion2_header', 'Distribucion 2', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_aporteEstrategicoDistribucion3_header', 'Distribucion 3', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_aporteEstrategicoDistribucion4_header', 'Distribucion 4', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_aporteEstrategicoDistribucion5_header', 'Distribucion 5', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_aporteEstrategicoProgramacion1_header', 'Programación 1', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_aporteEstrategicoProgramacion2_header', 'Programación 2', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_aporteEstrategicoProgramacion3_header', 'Programación 3', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_aporteEstrategicoProgramacion4_header', 'Programación 4', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_aporteEstrategicoProgramacion5_header', 'Programación 5', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_aporteEstrategicoPromedio1_header', 'Promedio 1', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_aporteEstrategicoPromedio2_header', 'Promedio 2', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_aporteEstrategicoPromedio3_header', 'Promedio 3', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_aporteEstrategicoPromedio4_header', 'Promedio 4', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_aporteEstrategicoPromedio5_header', 'Promedio 5', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_aporteEstrategicoEjecucion1_header', 'Ejecución 1', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_aporteEstrategicoEjecucion2_header', 'Ejecución 2', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_aporteEstrategicoEjecucion3_header', 'Ejecución 3', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_aporteEstrategicoEjecucion4_header', 'Ejecución 4', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_aporteEstrategicoEjecucion5_header', 'Ejecución 5', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_aporteEstrategicoAvance_header', 'Avance Aporte Estratégico', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_list_form_title', 'Consulta General de Seguimiento de Planificación Estratégica', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_list_form_table_header', 'Consulta General de Seguimiento de Planificación Estratégica', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_list_form_table_title', 'Consulta General de Seguimiento de Planificación Estratégica', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_planOperativoAnualInstitucional_select_label', 'Seleccione un Periodo Anual', SQ_I18N.nextval);

insert into i18n (version, usuario_creacion, fecha_creacion, fecha_modificacion, usuario_modificacion, campo_configurable, idioma, llave, valor, id_i18n) 
values (0,1, sysdate, sysdate,1, NULL, 'es', 'VistaAvancePLP_planOperativoAnualInstitucional_LOV_title', 'Seleccione un Periodo Anual', SQ_I18N.nextval);

DOMAIN JPA: VistaAvancePLP.java

  • Ahora debemos crear el domain para acceder a los datos

A PARTIR DE AQUÍ SON LAS FUNCIONES DE LA VERSIÓN 1 CON PARAMETRO PERIODO_ANUAL

FUNCION: OBTENER_METAS_OPE_FUCIONALES_X_PERIODO_ANUAL

--*******************************************************************************
--*******************************************************************************
-- FUNCIÓN: OBTENER_METAS_OPE_FUCIONALES_X_PERIODO_ANUAL
--*******************************************************************************
--*******************************************************************************

--+++++++++++++++++++++++++++++++++++++++++++++++++++++
-- PASO 0: ELIMINACIÓN DE DATOS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
DROP TYPE PPI.META_POA_TABLE_TYPE;
DROP TYPE PPI.META_POA_TYPE;
DROP FUNCTION PPI.OBTENER_METAS_OPE_FUNCIONALES_X_PERIODO_ANUAL;
DROP SYNONYM OBTENER_METAS_OPE_FUNCIONALES_X_PERIODO_ANUAL;

--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 01: Crear TIPO de tipo de dato META_POA
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE TYPE PPI.META_POA_TYPE AS OBJECT (
    META_POA NUMBER
);

GRANT EXECUTE ON PPI.META_POA_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 02: Crear TABLA de tipo de dato MetaPoaType
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE TYPE PPI.META_POA_TABLE_TYPE AS TABLE OF META_POA_TYPE;

GRANT EXECUTE ON PPI.META_POA_TABLE_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;

--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 03: Crear FUNCIÓN
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE FUNCTION  PPI.OBTENER_METAS_OPE_FUNCIONALES_X_PERIODO_ANUAL(
    periodoAnual IN NUMBER
)
RETURN META_POA_TABLE_TYPE PIPELINED AS

BEGIN
    FOR rec IN (
        SELECT MPE.META_POA
        FROM META_POA_EVALUACION MPE
        INNER JOIN META_POA MP ON (MP.ID_META_POA = MPE.META_POA)
        INNER JOIN OBJETIVO_POA OP ON (OP.ID_OBJETIVO_POA = MP.OBJETIVO_POA)
        INNER JOIN PLAN_OPERATIVO PO ON (PO.ID_PLAN_OPERATIVO = OP.PLAN_OPERATIVO)
        INNER JOIN UNIDAD_EJECUTORA UE_PO ON (UE_PO.ID_UNIDAD_EJECUTORA = PO.UNIDAD_EJECUTORA)
        INNER JOIN EVALUACION_OPERATIVA EO ON (EO.PLAN_OPERATIVO = PO.ID_PLAN_OPERATIVO)
        WHERE PO.PERIODO_ANUAL = periodoAnual
        AND PO.ESTADO_FORMULACION_OPE IN (SELECT VALOR FROM PARAMETRO WHERE LLAVE IN ('param_ppi_ppo_estadoFormulacionOpe_aprobado_unSoloNivel', 'param_ppi_ppo_estadoFormulacionOpe_aprobado_unidad_integradora'))
        AND PO.TIPO_PLAN_OPERATIVO = (SELECT VALOR FROM PARAMETRO WHERE LLAVE = 'param_ppi_ppo_tipoPlanOperativo_unidad')
        AND EO.ESTADO_EVALUACION_POA IN (SELECT VALOR FROM PARAMETRO WHERE LLAVE IN ('param_ppi_ppo_estadoEvaluacionPOA_aprobado_unSoloNivel', 'param_ppi_ppo_estadoEvaluacionPOA_aprobado_unidad_integradora'))
        AND MPE.ETAPA_PLAN = EO.ETAPA_PLAN
        --AND EO.FECHA_APROBACION = (
        --    SELECT 
         --   MAX(EO.FECHA_APROBACION) 
         --   FROM 
         --   EVALUACION_OPERATIVA EO1
         --   INNER JOIN PLAN_OPERATIVO PO1 ON (PO1.ID_PLAN_OPERATIVO = EO1.PLAN_OPERATIVO)
         --   WHERE 
         --   PO1.ID_PLAN_OPERATIVO = PO.ID_PLAN_OPERATIVO
         --   AND PO1.UNIDAD_EJECUTORA = PO.UNIDAD_EJECUTORA
        --)
        AND EO.FECHA_APROBACION = (
            SELECT 
                MAX(EO.FECHA_APROBACION) 
            FROM 
            EVALUACION_OPERATIVA EO1
            INNER JOIN PLAN_OPERATIVO PO1 ON (PO1.ID_PLAN_OPERATIVO = EO1.PLAN_OPERATIVO)
            WHERE 
            PO1.ID_PLAN_OPERATIVO = PO.ID_PLAN_OPERATIVO
            AND PO1.UNIDAD_EJECUTORA = PO.UNIDAD_EJECUTORA
        )
        ORDER BY MPE.META_POA
    ) LOOP
        PIPE ROW (META_POA_TYPE(rec.META_POA));
    END LOOP;

    RETURN;

END OBTENER_METAS_OPE_FUNCIONALES_X_PERIODO_ANUAL;

--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 04: GRANTS MetaPoa
--+++++++++++++++++++++++++++++++++++++++++++++++++++++

--***********************************************
-- GRANT'S
--***********************************************
GRANT EXECUTE ON PPI.OBTENER_METAS_OPE_FUNCIONALES_X_PERIODO_ANUAL TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 05: CONSULTAR DATOS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
SELECT * FROM TABLE(OBTENER_METAS_OPE_FUNCIONALES_X_PERIODO_ANUAL(202));

FUNCION: OBTENER_PERIODOS_ANUALES_DISTRIBUCION_X_PERIODO_ANUAL

--*******************************************************************************
--*******************************************************************************
-- FUNCIÓN: OBTENER_PERIODOS_ANUALES_DISTRIBUCION_X_PERIODO_ANUAL
--*******************************************************************************
--*******************************************************************************

--+++++++++++++++++++++++++++++++++++++++++++++++++++++
-- PASO 0: ELIMINACIÓN DE DATOS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
DROP TYPE PPI.PERIODO_ANUAL_TABLE_TYPE;
DROP TYPE PPI.PERIODO_ANUAL_TYPE;
DROP FUNCTION PPI.OBTENER_PERIODO_ANUAL_DISTRIBUCION_X_PERIODO_ANUAL;
DROP SYNONYM OBTENER_PERIODO_ANUAL_DISTRIBUCION_X_PERIODO_ANUAL;

--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 01: Crear TIPO de tipo de dato PERIODO_ANUAL_TYPE
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE TYPE PPI.PERIODO_ANUAL_TYPE AS OBJECT (
    PERIODO_ANUAL NUMBER
);

GRANT EXECUTE ON PPI.PERIODO_ANUAL_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 02: Crear TABLA de tipo de dato PERIODO_ANUAL_TYPE
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE TYPE PPI.PERIODO_ANUAL_TABLE_TYPE AS TABLE OF PERIODO_ANUAL_TYPE;

GRANT EXECUTE ON PPI.PERIODO_ANUAL_TABLE_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 03: Crear FUNCIÓN
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE FUNCTION  PPI.OBTENER_PERIODO_ANUAL_DISTRIBUCION_X_PERIODO_ANUAL(
    periodoAnual IN NUMBER
)
RETURN PERIODO_ANUAL_TABLE_TYPE PIPELINED AS

BEGIN
    FOR rec IN (
        SELECT 
        DISTINCT
        APD.PERIODO_ANUAL
        FROM
        META_POA_APORTE MPAP
        INNER JOIN (SELECT *
        FROM TABLE(PPI.OBTENER_METAS_OPE_FUNCIONALES_X_PERIODO_ANUAL(periodoAnual))) METAS_FUNCIONALES on MPAP.META_POA = METAS_FUNCIONALES.META_POA
        INNER JOIN APORTE_ESTRATEGICO APE ON (APE.ID_APORTE_ESTRATEGICO = MPAP.APORTE_ESTRATEGICO)
        INNER JOIN APORTE_PAE_DISTRIBUCION APD ON (APD.APORTE_ESTRATEGICO = APE.ID_APORTE_ESTRATEGICO)
        ORDER BY APD.PERIODO_ANUAL
    ) LOOP
        PIPE ROW (PERIODO_ANUAL_TYPE(rec.PERIODO_ANUAL));
    END LOOP;

    RETURN;

END OBTENER_PERIODO_ANUAL_DISTRIBUCION_X_PERIODO_ANUAL;

--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 04: GRANTS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++

GRANT EXECUTE ON  PPI.OBTENER_PERIODO_ANUAL_DISTRIBUCION_X_PERIODO_ANUAL TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 05: CONSULTAR DATOS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
SELECT * FROM TABLE(PPI.OBTENER_PERIODO_ANUAL_DISTRIBUCION_X_PERIODO_ANUAL(202));

FUNCIÓN: OBTENER_APD_X_PERIODDO_ANUAL

--*******************************************************************************
--*******************************************************************************
-- FUNCIÓN: OBTENER_APD_X_PERIODDO_ANUAL
--*******************************************************************************
--*******************************************************************************


--*****************************************************
--COMPONENTE REQUERIDO: AÑO
--*****************************************************

--+++++++++++++++++++++++++++++++++++++++++++++++++++++
-- PASO 0: ELIMINACIÓN DE DATOS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
DROP TYPE PPI.ANO_TABLE_TYPE;
DROP TYPE PPI.ANO_TYPE;

--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 01: Crear TIPO de tipo de dato APD_TYPE
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE TYPE PPI.ANO_TYPE AS OBJECT (
    ANO NUMBER(4)
);
GRANT EXECUTE ON PPI.ANO_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 02: Crear TABLA de tipo de dato ANO_TYPE
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE TYPE PPI.ANO_TABLE_TYPE AS TABLE OF ANO_TYPE;

GRANT EXECUTE ON PPI.ANO_TABLE_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;





--*****************************************************
--FUNCIÓN: OBTENER_APD_X_PERIODDO_ANUAL
--*****************************************************

--+++++++++++++++++++++++++++++++++++++++++++++++++++++
-- PASO 0: ELIMINACIÓN DE DATOS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
DROP TYPE PPI.APD_TABLE_TYPE;
DROP TYPE PPI.APD_TYPE;
DROP FUNCTION PPI.OBTENER_APD_X_PERIODO_ANUAL;
DROP SYNONYM OBTENER_APD_X_PERIODO_ANUAL;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 01: Crear TIPO de tipo de dato APD_TYPE
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE TYPE     APD_TYPE AS OBJECT (
    APORTE_ESTRATEGICO  NUMBER,
    ANNO_1              NUMBER,
    ANNO_2              NUMBER,
    ANNO_3              NUMBER,
    ANNO_4              NUMBER,
    ANNO_5              NUMBER
);
GRANT EXECUTE ON PPI.APD_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 02: Crear TABLA de tipo de dato APD_TYPE
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE TYPE PPI.APD_TABLE_TYPE AS TABLE OF APD_TYPE;

GRANT EXECUTE ON PPI.APD_TABLE_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 03: Crear FUNCIÓN
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE FUNCTION PPI.OBTENER_APD_X_PERIODO_ANUAL(
    --periodoAnual: parametro de ingreso
    periodoAnual IN NUMBER
)
--RETURN: tabla virtual de tipo APD_TABLE_TYPE
RETURN APD_TABLE_TYPE PIPELINED AS

    --***************************************************************
    --VARIABLES
    --***************************************************************
    -- Almacena los años en un arreglo
    v_periodos  PERIODO_ANUAL_TABLE_TYPE := PERIODO_ANUAL_TABLE_TYPE();

    -- Variable para almacenar el año actual
    v_periodo PERIODO_ANUAL_TYPE;


    -- Almacena los años en un arreglo
    v_anos ANO_TABLE_TYPE := ANO_TABLE_TYPE();

    -- Variable para almacenar el año actual
    v_ano ANO_TYPE;

    -- Variable para construir la consulta PIVOT
    v_sql CLOB;

    -- Variable para almacenar el resultado de la consulta PIVOT
    v_result SYS_REFCURSOR;

    -- Variables para almacenar los valores dinámicos de las columnas del PIVOT
    v_aporte NUMBER;
    v_anno_1 NUMBER;
    v_anno_2 NUMBER;
    v_anno_3 NUMBER;
    v_anno_4 NUMBER;
    v_anno_5 NUMBER;

BEGIN
    --***************************************************************
    --OBTENCIÓN DE DATOS
    --***************************************************************
    -- Ejecutar consulta del ID_PERIODO_ANUAL y  ANO para almacenarlos en arreglos para crear el PIVOT 
    FOR rec IN (SELECT ANO, ID_PERIODO_ANUAL
                FROM PERIODO_ANUAL
                WHERE ID_PERIODO_ANUAL IN (SELECT PERIODO_ANUAL
                                           FROM TABLE(PPI.OBTENER_PERIODO_ANUAL_DISTRIBUCION_X_PERIODO_ANUAL(periodoAnual)))
                ORDER BY ANO)
    LOOP
        -- Utilizar el constructor del tipo ANO_TYPE
        v_ano := ANO_TYPE(rec.ANO);

        -- Utilizar el constructor del tipo ANO_TYPE
        v_periodo := PERIODO_ANUAL_TYPE(rec.ID_PERIODO_ANUAL);

       -- Añadir los resultados al arreglo de años
        v_periodos.EXTEND;
        v_periodos(v_periodos.LAST) := v_periodo;

        -- Añadir los resultados al arreglo de años
        v_anos.EXTEND;
        v_anos(v_anos.LAST) := v_ano;

    END LOOP;


    --**************************************************************
    --CONSULTA DINÁMICA
    --**************************************************************
    v_sql := 'SELECT * FROM (SELECT APD.APORTE_ESTRATEGICO, APD.PERIODO_ANUAL, APD.DISTRIBUCION_PORCENTUAL ';
    v_sql := v_sql || 'FROM META_POA_APORTE MPAP ';
    v_sql := v_sql || 'INNER JOIN (SELECT * FROM TABLE(PPI.OBTENER_METAS_OPE_FUNCIONALES_X_PERIODO_ANUAL(' || periodoAnual || '))) METAS_FUNCIONAES ';
    v_sql := v_sql || 'ON MPAP.META_POA = METAS_FUNCIONAES.META_POA ';
    v_sql := v_sql || 'INNER JOIN APORTE_ESTRATEGICO APE ON APE.ID_APORTE_ESTRATEGICO = MPAP.APORTE_ESTRATEGICO ';
    v_sql := v_sql || 'INNER JOIN APORTE_PAE_DISTRIBUCION APD ON APD.APORTE_ESTRATEGICO = APE.ID_APORTE_ESTRATEGICO ';
    v_sql := v_sql || 'WHERE APD.PERIODO_ANUAL IN (SELECT * FROM TABLE(PPI.OBTENER_PERIODO_ANUAL_DISTRIBUCION_X_PERIODO_ANUAL(' || periodoAnual || ')))) ';
    v_sql := v_sql || 'PIVOT (MAX(DISTRIBUCION_PORCENTUAL) FOR PERIODO_ANUAL IN (';

    FOR i IN 1..v_anos.LAST LOOP
        v_sql := v_sql || v_periodos(i).PERIODO_ANUAL || ' as "' || v_anos(i).ANO || '"';
        IF i < v_anos.LAST THEN
            v_sql := v_sql || ', ';
        END IF;
    END LOOP;

    v_sql := v_sql || ')) ORDER BY APORTE_ESTRATEGICO';


    -- Ejecutar la consulta PIVOT
    OPEN v_result FOR v_sql;

    --**************************************************************
    --RECUPERAR Y FORMATEAAR LOS DATOS
    --**************************************************************
    LOOP
       FETCH v_result INTO v_aporte,v_anno_1, v_anno_2, v_anno_3, v_anno_4, v_anno_5;
       EXIT WHEN v_result%NOTFOUND;

       PIPE ROW(APD_TYPE(v_aporte,v_anno_1, v_anno_2, v_anno_3, v_anno_4, v_anno_5));
    END LOOP;

    CLOSE v_result;

    RETURN;

END OBTENER_APD_X_PERIODO_ANUAL;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 04: GRANTS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++


--***********************************************
-- GRANT'S
--***********************************************
GRANT EXECUTE ON  PPI.OBTENER_APD_X_PERIODO_ANUAL TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 05: CONSULTAR DATOS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
SELECT * FROM TABLE(PPI.OBTENER_APD_X_PERIODO_ANUAL(202));

FUNCIÓN: OBTENER_PROGRAMACION_X_PERIODO_ANUAL

--*******************************************************************************
--*******************************************************************************
-- FUNCIÓN: OBTENER_PROGRAMACION_X_PERIODO_ANUAL
--*******************************************************************************
--*******************************************************************************

--+++++++++++++++++++++++++++++++++++++++++++++++++++++
-- PASO 0: ELIMINACIÓN DE DATOS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
DROP TYPE PPI.PROGRAMACION_TABLE_TYPE;
DROP TYPE PPI.PROGRAMACION_TYPE;
DROP FUNCTION PPI.OBTENER_PROGRAMACION_X_PERIODO_ANUAL;
DROP SYNONYM OBTENER_PROGRAMACION_X_PERIODO_ANUAL;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 01: Crear TIPO de tipo de dato APD_TYPE
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE TYPE PPI.PROGRAMACION_TYPE AS OBJECT (
    APORTE_ESTRATEGICO          NUMBER,
    DISTRIBUCION_PORCENTUAL     NUMBER,
    CANTIDAD_APORTES            NUMBER,
    REPRESENTATIVIDAD           NUMBER,
    PROGRAMACION                NUMBER
);

GRANT EXECUTE ON PPI.PROGRAMACION_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 02: Crear TABLA de tipo de dato PROGRAMACION_TYPE
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE TYPE PPI.PROGRAMACION_TABLE_TYPE AS TABLE OF PROGRAMACION_TYPE;

GRANT EXECUTE ON PPI.PROGRAMACION_TABLE_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 03: Crear FUNCIÓN
--+++++++++++++++++++++++++++++++++++++++++++++++++++++


CREATE OR REPLACE FUNCTION  PPI.OBTENER_PROGRAMACION_X_PERIODO_ANUAL(
    periodoAnual IN NUMBER
)
RETURN PROGRAMACION_TABLE_TYPE PIPELINED AS

BEGIN
    FOR rec IN (
        
        SELECT 
        --DISTINCT 
        APD.APORTE_ESTRATEGICO                                          APORTE_ESTRATEGICO,
        APD.DISTRIBUCION_PORCENTUAL                                     DISTRIBUCION_PORCENTUAL,
        CAN_APO.CANTIDAD_APORTES                                        CANTIDAD_APORTES_X_ACCION,
        (1 / CAN_APO.CANTIDAD_APORTES)                                  REPRESENTATIVIDAD,
        APD.DISTRIBUCION_PORCENTUAL*(1 / CAN_APO.CANTIDAD_APORTES)      PROGRAMACION
        FROM
        META_POA_APORTE                         MPAP
        INNER JOIN (SELECT * FROM TABLE(PPI.OBTENER_METAS_OPE_FUNCIONALES_X_PERIODO_ANUAL(periodoAnual))) METAS_FUNCIONALES on MPAP.META_POA = METAS_FUNCIONALES.META_POA
        INNER JOIN APORTE_ESTRATEGICO           APE ON (APE.ID_APORTE_ESTRATEGICO = MPAP.APORTE_ESTRATEGICO)
        INNER JOIN APORTE_PAE_DISTRIBUCION      APD ON (APD.APORTE_ESTRATEGICO = APE.ID_APORTE_ESTRATEGICO)
        INNER JOIN ACCION_ESTRATEGICA           ACE ON (ACE.ID_ACCION_ESTRATEGICA = APE.ACCION_ESTRATEGICA)
        INNER JOIN (SELECT ACCION_ESTRATEGICA, COUNT(*) AS CANTIDAD_APORTES FROM PPI.APORTE_ESTRATEGICO GROUP BY ACCION_ESTRATEGICA) CAN_APO ON CAN_APO.ACCION_ESTRATEGICA = ACE.ID_ACCION_ESTRATEGICA
        WHERE APD.PERIODO_ANUAL = periodoAnual
        ORDER BY 
        APD.APORTE_ESTRATEGICO 
    ) LOOP
        PIPE ROW(PROGRAMACION_TYPE(REC.APORTE_ESTRATEGICO,REC.DISTRIBUCION_PORCENTUAL,REC.CANTIDAD_APORTES_X_ACCION, REC.REPRESENTATIVIDAD, REC.PROGRAMACION));
    END LOOP;

    RETURN;

END OBTENER_PROGRAMACION_X_PERIODO_ANUAL;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 04: GRANTS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++

--***********************************************
-- GRANT'S
--***********************************************
GRANT EXECUTE ON  PPI.OBTENER_PROGRAMACION_X_PERIODO_ANUAL TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 05: CONSULTAR DATOS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
SELECT * FROM TABLE(PPI.OBTENER_PROGRAMACION_X_PERIODO_ANUAL(202));

FUNCIÓN: OBTENER_ULTIMA_ETAPA_PLAN_EVALUACION_FINALIZADA

--*******************************************************************************
--*******************************************************************************
-- FUNCIÓN: OBTENER_ULTIMA_ETAPA_PLAN_EVALUACION_FINALIZADA
--*******************************************************************************
--*******************************************************************************

CREATE OR REPLACE FUNCTION  PPI.OBTENER_ULTIMA_ETAPA_PLAN_EVALUACION_FINALIZADA(
    periodoAnual IN NUMBER
)
RETURN NUMBER
IS
    v_id_etapa_plan NUMBER;
    
BEGIN

    SELECT
        EP.ID_ETAPA_PLAN INTO v_id_etapa_plan
    FROM ETAPA_PLAN EP
    WHERE
    EP.TIPO_ETAPA = (SELECT VALOR FROM PARAMETRO WHERE LLAVE = 'param_ppi_ppo_tipoEtapa_evaluacion')
    AND EP.PERIODO_ANUAL = periodoAnual
    AND EP.TIPO_PLAN_OPERATIVO = (SELECT VALOR FROM PARAMETRO WHERE LLAVE = 'param_ppi_ppo_tipoPlanOperativo_unidad')
    AND EP.FECHA_FINAL_EVALUACION <= TRUNC(SYSDATE)
    ORDER BY
    EP.FECHA_FINAL_EVALUACION DESC
    FETCH FIRST 1 ROW ONLY;

  RETURN v_id_etapa_plan;
END OBTENER_ULTIMA_ETAPA_PLAN_EVALUACION_FINALIZADA;

--PROBAR CONSULTA
SELECT PPI.OBTENER_ULTIMA_ETAPA_PLAN_EVALUACION_FINALIZADA(:periodoAnual) AS ULTIMA_ETAPA_PLAN_EVALUACION FROM DUAL;

FUNCIÓN: OBTENER_PROMEDIO_AVANCE_APORTE_X_PERIODO_ANUAL

--*******************************************************************************
--*******************************************************************************
-- FUNCIÓN: OBTENER_PROMEDIO_AVANCE_APORTE_X_PERIODO_ANUAL
--*******************************************************************************
--*******************************************************************************

--+++++++++++++++++++++++++++++++++++++++++++++++++++++
-- PASO 0: ELIMINACIÓN DE DATOS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
DROP TYPE PPI.PROMEDIO_AVANCE_APORTE_TABLE_TYPE;
DROP TYPE PPI.PROMEDIO_AVANCE_APORTE_TYPE;
DROP FUNCTION PPI.OBTENER_PROMEDIO_AVANCE_APORTE_X_PERIODO_ANUAL;

--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 01: Crear TIPO de tipo de dato PERIODO_ANUAL_TYPE
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE TYPE PPI.PROMEDIO_AVANCE_APORTE_TYPE AS OBJECT (
    APORTE_ESTRATEGICO  NUMBER,
    PROMEDIO            NUMBER,
    ETAPA_PLAN          NUMBER
);

GRANT EXECUTE ON PPI.PROMEDIO_AVANCE_APORTE_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 02: Crear TABLA de tipo de dato PERIODO_ANUAL_TYPE
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE TYPE PPI.PROMEDIO_AVANCE_APORTE_TABLE_TYPE AS TABLE OF PROMEDIO_AVANCE_APORTE_TYPE;

GRANT EXECUTE ON PPI.PROMEDIO_AVANCE_APORTE_TABLE_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 03: Crear FUNCIÓN
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE FUNCTION  PPI.OBTENER_PROMEDIO_AVANCE_APORTE_X_PERIODO_ANUAL(
    periodoAnual IN NUMBER
)
RETURN PROMEDIO_AVANCE_APORTE_TABLE_TYPE PIPELINED AS

BEGIN

    FOR rec IN (
            SELECT 
                MPA.APORTE_ESTRATEGICO,
                NVL(AVG(MPE.EJECUCION),0) PROMEDIO,
                MPE.ETAPA_PLAN
                FROM
                META_POA_APORTE MPA
                INNER JOIN (
                    SELECT * FROM TABLE(
                        PPI.OBTENER_METAS_OPE_FUNCIONALES_X_PERIODO_ANUAL(periodoAnual)
                    )
                ) METAS_FUNCIONALES ON MPA.META_POA = METAS_FUNCIONALES.META_POA
                INNER JOIN META_POA_EVALUACION MPE ON (MPE.META_POA = MPA.META_POA)
                INNER JOIN ETAPA_PLAN EP ON (EP.ID_ETAPA_PLAN = MPE.ETAPA_PLAN)
                WHERE 
                EP.PERIODO_ANUAL = periodoAnual
                AND MPE.ETAPA_PLAN = PPI.OBTENER_ULTIMA_ETAPA_PLAN_EVALUACION_FINALIZADA(periodoAnual)
                GROUP BY MPA.APORTE_ESTRATEGICO, MPE.ETAPA_PLAN
                ORDER BY 
                MPA.APORTE_ESTRATEGICO
    ) 
    LOOP
    PIPE ROW (PROMEDIO_AVANCE_APORTE_TYPE(rec.APORTE_ESTRATEGICO,rec.PROMEDIO, rec.ETAPA_PLAN));
   END LOOP;

    DBMS_OUTPUT.PUT_LINE('DEBUG: periodoAnual: ' || periodoAnual);
    
    RETURN;

END OBTENER_PROMEDIO_AVANCE_APORTE_X_PERIODO_ANUAL;

--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 04: GRANTS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++

GRANT EXECUTE ON  PPI.OBTENER_PROMEDIO_AVANCE_APORTE_X_PERIODO_ANUAL TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 05: CONSULTAR DATOS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
SELECT * FROM TABLE(PPI.OBTENER_PROMEDIO_AVANCE_APORTE_X_PERIODO_ANUAL(:periodoAnual));

FUNCIÓN: OBTENER_EJECUCION_X_PERIODO_ANUAL

--*******************************************************************************
--*******************************************************************************
-- FUNCIÓN: OBTENER_EJECUCION_X_PERIODO_ANUAL
--*******************************************************************************
--*******************************************************************************

--+++++++++++++++++++++++++++++++++++++++++++++++++++++
-- PASO 0: ELIMINACIÓN DE DATOS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
DROP TYPE PPI.EJECUCION_TABLE_TYPE;
DROP TYPE PPI.EJECUCION_TYPE;
DROP FUNCTION PPI.OBTENER_EJECUCION_X_PERIODO_ANUAL;



--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 01: Crear TIPO de tipo de dato APD_TYPE
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE TYPE PPI.EJECUCION_TYPE AS OBJECT (
    APORTE_ESTRATEGICO          NUMBER,
    PROGRAMACION                NUMBER,
    PROMEDIO                    NUMBER,
    ETAPA_PLAN                  NUMBER,
    EJECUCION                   NUMBER
);

GRANT EXECUTE ON PPI.EJECUCION_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 02: Crear TABLA de tipo de dato PROGRAMACION_TYPE
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE TYPE PPI.EJECUCION_TABLE_TYPE AS TABLE OF EJECUCION_TYPE;

GRANT EXECUTE ON PPI.EJECUCION_TABLE_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 03: Crear FUNCIÓN
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE FUNCTION  PPI.OBTENER_EJECUCION_X_PERIODO_ANUAL(
    periodoAnual IN NUMBER
)
RETURN EJECUCION_TABLE_TYPE PIPELINED AS

BEGIN

    FOR rec IN (
            SELECT 
                PROGRAMACION.APORTE_ESTRATEGICO                                 APORTE_ESTRATEGICO,
                PROGRAMACION.PROGRAMACION                                       PROGRAMACION,
                PROMEDIO.PROMEDIO                                               PROMEDIO,
                PROMEDIO.ETAPA_PLAN                                             ETAPA_PLAN,
                ((PROGRAMACION.PROGRAMACION*PROMEDIO.PROMEDIO)/100)             EJECUCION
            FROM TABLE(PPI.OBTENER_PROGRAMACION_X_PERIODO_ANUAL(periodoAnual)) PROGRAMACION
            
            INNER JOIN (
                SELECT * FROM TABLE(PPI.OBTENER_PROMEDIO_AVANCE_APORTE_X_PERIODO_ANUAL(periodoAnual))
            ) PROMEDIO ON PROGRAMACION.APORTE_ESTRATEGICO = PROMEDIO.APORTE_ESTRATEGICO
            WHERE 
            PROMEDIO.ETAPA_PLAN = PPI.OBTENER_ULTIMA_ETAPA_PLAN_EVALUACION_FINALIZADA(periodoAnual)
            ORDER BY 
            PROGRAMACION.APORTE_ESTRATEGICO
    ) 
    LOOP
    PIPE ROW (EJECUCION_TYPE(rec.APORTE_ESTRATEGICO,rec.PROGRAMACION, rec.PROMEDIO,rec.ETAPA_PLAN,rec.EJECUCION));
   END LOOP;

    DBMS_OUTPUT.PUT_LINE('DEBUG: periodoAnual: ' || periodoAnual);
    
    RETURN;

END OBTENER_EJECUCION_X_PERIODO_ANUAL;



--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 04: GRANTS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++

--***********************************************
-- GRANT'S
--***********************************************
GRANT EXECUTE ON  PPI.OBTENER_EJECUCION_X_PERIODO_ANUAL TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 05: CONSULTAR DATOS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
SELECT * FROM TABLE(PPI.OBTENER_EJECUCION_X_PERIODO_ANUAL(:periodoAnual));

FUNCIÓN: OBTENER_ACUMULADO_X_PERIODO_ANUAL

--*******************************************************************************
--*******************************************************************************
-- FUNCIÓN: OBTENER_ACUMULADO_X_PERIODO_ANUAL
--*******************************************************************************
--*******************************************************************************

--+++++++++++++++++++++++++++++++++++++++++++++++++++++
-- PASO 0: ELIMINACIÓN DE DATOS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
DROP TYPE PPI.ACUMULADO_TABLE_TYPE;
DROP TYPE PPI.ACUMULADO_TYPE;
DROP FUNCTION PPI.OBTENER_ACUMULADO_X_PERIODO_ANUAL;



--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 01: Crear TIPO de tipo de dato APD_TYPE
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE TYPE PPI.ACUMULADO_TYPE AS OBJECT (
    APORTE_ESTRATEGICO          NUMBER,
    ACUMULADO                   NUMBER
);

GRANT EXECUTE ON PPI.ACUMULADO_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 02: Crear TABLA de tipo de dato ACUMULADO_TYPE
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE TYPE PPI.ACUMULADO_TABLE_TYPE AS TABLE OF ACUMULADO_TYPE;

GRANT EXECUTE ON PPI.ACUMULADO_TABLE_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 03: Crear FUNCIÓN
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE FUNCTION PPI.OBTENER_ACUMULADO_X_PERIODO_ANUAL(
    --periodoAnual: parametro de ingreso
    periodoAnual IN NUMBER
)
--RETURN: tabla virtual de tipo APD_TABLE_TYPE
RETURN ACUMULADO_TABLE_TYPE PIPELINED AS

    --***************************************************************
    --VARIABLES
    --***************************************************************
    -- Almacena los años en un arreglo
    v_periodos  PERIODO_ANUAL_TABLE_TYPE := PERIODO_ANUAL_TABLE_TYPE();

    -- Variable para almacenar el año actual
    v_periodo PERIODO_ANUAL_TYPE;



    -- Variable para construir la consulta PIVOT
    v_sql CLOB;

    -- Variable para almacenar el resultado de la consulta PIVOT
    v_result SYS_REFCURSOR;

     -- Variables para almacenar los valores dinámicos de las columnas del PIVOT
    v_aporte        NUMBER;
    v_acumulado     NUMBER;


BEGIN
    --***************************************************************
    --OBTENCIÓN DE DATOS
    --***************************************************************
    -- Ejecutar consulta del ID_PERIODO_ANUAL y  ANO para almacenarlos en arreglos para crear el PIVOT 
    FOR rec IN (SELECT PERIODO_ANUAL FROM TABLE(PPI.OBTENER_PERIODO_ANUAL_DISTRIBUCION_X_PERIODO_ANUAL(periodoAnual)) ORDER BY PERIODO_ANUAL)
    LOOP

        -- Utilizar el constructor del tipo ANO_TYPE
        v_periodo := PERIODO_ANUAL_TYPE(rec.PERIODO_ANUAL);

       -- Añadir los resultados al arreglo de años
        v_periodos.EXTEND;
        v_periodos(v_periodos.LAST) := v_periodo;



    END LOOP;


    --**************************************************************
    --CONSULTA DINÁMICA
    --**************************************************************
    v_sql := 'SELECT ';
    
    --FOR i IN 1..v_periodos.LAST LOOP
     --   v_sql := v_sql || 'NVL(EJECUCION_'|| v_periodos(i).PERIODO_ANUAL || '.EJECUCION,0) EJECUCION_' || v_periodos(i).PERIODO_ANUAL || ',';   
    --END LOOP;
    v_sql := v_sql || 'EJECUCION_' || v_periodos(1).PERIODO_ANUAL || '.APORTE_ESTRATEGICO,';
   
    v_sql := v_sql || '(';
    FOR i IN 1..v_periodos.LAST LOOP
        v_sql := v_sql || 'NVL(EJECUCION_'|| v_periodos(i).PERIODO_ANUAL || '.EJECUCION,0) ';
        IF i < v_periodos.LAST THEN
            v_sql := v_sql || ' + ';
        END IF;
    END LOOP;
    v_sql := v_sql || ') AS ACUMULADO ';
    v_sql := v_sql || 'FROM TABLE(PPI.OBTENER_EJECUCION_X_PERIODO_ANUAL(' || v_periodos(1).PERIODO_ANUAL || ')) EJECUCION_' || v_periodos(1).PERIODO_ANUAL || ' ';
    
    FOR i IN 2..v_periodos.LAST LOOP
        v_sql := v_sql || 'LEFT JOIN ';  
        v_sql := v_sql || '( ';  
        v_sql := v_sql || 'SELECT '; 
        v_sql := v_sql || 'APORTE_ESTRATEGICO, '; 
        v_sql := v_sql || 'EJECUCION '; 
        v_sql := v_sql || 'FROM TABLE(PPI.OBTENER_EJECUCION_X_PERIODO_ANUAL(' || v_periodos(i).PERIODO_ANUAL || '))'; 
        v_sql := v_sql || ') EJECUCION_' ||  v_periodos(i).PERIODO_ANUAL || ' ON EJECUCION_' || v_periodos(1).PERIODO_ANUAL || '.APORTE_ESTRATEGICO = EJECUCION_' || v_periodos(i).PERIODO_ANUAL || '.APORTE_ESTRATEGICO '; 
        v_sql := v_sql || ' '; 
    END LOOP;
    

  

    v_sql := v_sql || 'ORDER BY EJECUCION_'||v_periodos(1).PERIODO_ANUAL ||'.APORTE_ESTRATEGICO';


    -- Ejecutar la consulta PIVOT
    OPEN v_result FOR v_sql;

    --**************************************************************
    --RECUPERAR Y FORMATEAAR LOS DATOS
    --**************************************************************
    LOOP
       FETCH v_result INTO v_aporte,v_acumulado;
       EXIT WHEN v_result%NOTFOUND;

       PIPE ROW(ACUMULADO_TYPE(v_aporte,v_acumulado));
    END LOOP;

    CLOSE v_result;

    RETURN;

END OBTENER_ACUMULADO_X_PERIODO_ANUAL;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 04: GRANTS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++

--***********************************************
-- GRANT'S
--***********************************************
GRANT EXECUTE ON  PPI.OBTENER_ACUMULADO_X_PERIODO_ANUAL TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 05: CONSULTAR DATOS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
SELECT * FROM TABLE(PPI.OBTENER_ACUMULADO_X_PERIODO_ANUAL(:periodoAnual));

FUNCIÓN: OBTENER_ACUMULADO_ACCION_X_PERIODO_ANUAL

--*******************************************************************************
--*******************************************************************************
-- FUNCIÓN: OBTENER_ACUMULADO_ACCION_X_PERIODO_ANUAL
--*******************************************************************************
--*******************************************************************************

--+++++++++++++++++++++++++++++++++++++++++++++++++++++
-- PASO 0: ELIMINACIÓN DE DATOS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
DROP TYPE PPI.ACUMULADO_ACCION_TABLE_TYPE;
DROP TYPE PPI.ACUMULADO_ACCION_TYPE;
DROP FUNCTION PPI.OBTENER_ACUMULADO_ACCION_X_PERIODO_ANUAL;



--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 01: Crear TIPO de tipo de dato APD_TYPE
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE TYPE PPI.ACUMULADO_ACCION_TYPE AS OBJECT (
    ACCION_ESTRATEGICA          NUMBER,
    ACUMULADO_ACCION            NUMBER
);

GRANT EXECUTE ON PPI.ACUMULADO_ACCION_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 02: Crear TABLA de tipo de dato PROGRAMACION_TYPE
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE TYPE PPI.ACUMULADO_ACCION_TABLE_TYPE AS TABLE OF ACUMULADO_ACCION_TYPE;

GRANT EXECUTE ON PPI.ACUMULADO_ACCION_TABLE_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 03: Crear FUNCIÓN
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE FUNCTION  PPI.OBTENER_ACUMULADO_ACCION_X_PERIODO_ANUAL(
    periodoAnual IN NUMBER
)
RETURN ACUMULADO_ACCION_TABLE_TYPE PIPELINED AS

BEGIN

    FOR rec IN (
            SELECT 
              ACE.ID_ACCION_ESTRATEGICA,
              SUM(ACUMULADO.ACUMULADO) AS ACUMULADO_X_ACCION
            FROM 
              ACCION_ESTRATEGICA ACE
            INNER JOIN 
              APORTE_ESTRATEGICO APE ON (APE.ACCION_ESTRATEGICA = ACE.ID_ACCION_ESTRATEGICA)
            -- ACUMULADO
            INNER JOIN (
                SELECT * FROM TABLE(PPI.OBTENER_ACUMULADO_X_PERIODO_ANUAL(periodoAnual))
            ) ACUMULADO ON APE.ID_APORTE_ESTRATEGICO = ACUMULADO.APORTE_ESTRATEGICO
            GROUP BY 
              ACE.ID_ACCION_ESTRATEGICA
            ORDER BY 
              ACE.ID_ACCION_ESTRATEGICA
    ) 
    LOOP
    PIPE ROW (ACUMULADO_ACCION_TYPE(rec.ID_ACCION_ESTRATEGICA,rec.ACUMULADO_X_ACCION));
   END LOOP;

    DBMS_OUTPUT.PUT_LINE('DEBUG: periodoAnual: ' || periodoAnual);
    
    RETURN;

END OBTENER_ACUMULADO_ACCION_X_PERIODO_ANUAL;



--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 04: GRANTS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++

--***********************************************
-- GRANT'S
--***********************************************
GRANT EXECUTE ON  PPI.OBTENER_ACUMULADO_ACCION_X_PERIODO_ANUAL TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 05: CONSULTAR DATOS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
SELECT * FROM TABLE(PPI.OBTENER_ACUMULADO_ACCION_X_PERIODO_ANUAL(:periodoAnual));

FUNCIÓN: OBTENER_ACUMULADO_METAPMP_X_PERIODO_ANUAL

--*******************************************************************************
--*******************************************************************************
-- FUNCIÓN: OBTENER_ACUMULADO_METAPMP_X_PERIODO_ANUAL
--*******************************************************************************
--*******************************************************************************

--+++++++++++++++++++++++++++++++++++++++++++++++++++++
-- PASO 0: ELIMINACIÓN DE DATOS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
DROP TYPE PPI.ACUMULADO_METAPMP_TABLE_TYPE;
DROP TYPE PPI.ACUMULADO_METAPMP_TYPE;
DROP FUNCTION PPI.OBTENER_ACUMULADO_METAPMP_X_PERIODO_ANUAL;



--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 01: Crear TIPO de tipo de dato APD_TYPE
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE TYPE PPI.ACUMULADO_METAPMP_TYPE AS OBJECT (
    META_PMP                    NUMBER,
    ACUMULADO_METAPMP           NUMBER
);

GRANT EXECUTE ON PPI.ACUMULADO_METAPMP_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 02: Crear TABLA de tipo de dato PROGRAMACION_TYPE
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE TYPE PPI.ACUMULADO_METAPMP_TABLE_TYPE AS TABLE OF ACUMULADO_METAPMP_TYPE;

GRANT EXECUTE ON PPI.ACUMULADO_METAPMP_TABLE_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 03: Crear FUNCIÓN
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE FUNCTION  PPI.OBTENER_ACUMULADO_METAPMP_X_PERIODO_ANUAL(
    periodoAnual IN NUMBER
)
RETURN ACUMULADO_METAPMP_TABLE_TYPE PIPELINED AS

BEGIN

    FOR rec IN (
            SELECT 
              MPMP.ID_META_PMP,
              NVL(AVG(ACUMULADO_ACCION.ACUMULADO_ACCION),0) AS ACUMULADO_X_META
            FROM 
            META_PMP MPMP
            INNER JOIN ACCION_ESTRATEGICA ACE ON (ACE.META_PMP = MPMP.ID_META_PMP)
            --ACUMULADO ACCION
            INNER JOIN (
                SELECT * FROM TABLE(PPI.OBTENER_ACUMULADO_ACCION_X_PERIODO_ANUAL(periodoAnual))
            ) ACUMULADO_ACCION ON ACE.ID_ACCION_ESTRATEGICA = ACUMULADO_ACCION.ACCION_ESTRATEGICA
            
            GROUP BY 
              MPMP.ID_META_PMP
            ORDER BY
            MPMP.ID_META_PMP
    ) 
    LOOP
    PIPE ROW (ACUMULADO_METAPMP_TYPE(rec.ID_META_PMP,rec.ACUMULADO_X_META));
   END LOOP;

    DBMS_OUTPUT.PUT_LINE('DEBUG: periodoAnual: ' || periodoAnual);
    
    RETURN;

END OBTENER_ACUMULADO_METAPMP_X_PERIODO_ANUAL;



--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 04: GRANTS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++

--***********************************************
-- GRANT'S
--***********************************************
GRANT EXECUTE ON  PPI.OBTENER_ACUMULADO_METAPMP_X_PERIODO_ANUAL TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 05: CONSULTAR DATOS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
SELECT * FROM TABLE(PPI.OBTENER_ACUMULADO_METAPMP_X_PERIODO_ANUAL(:periodoAnual));

FUNCIÓN: OBTENER_ACUMULADO_PRIORIDAD_X_PERIODO_ANUAL

--*******************************************************************************
--*******************************************************************************
-- FUNCIÓN: OBTENER_ACUMULADO_PRIORIDAD_X_PERIODO_ANUAL
--*******************************************************************************
--*******************************************************************************

--+++++++++++++++++++++++++++++++++++++++++++++++++++++
-- PASO 0: ELIMINACIÓN DE DATOS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
DROP TYPE PPI.ACUMULADO_PRIORIDAD_TABLE_TYPE;
DROP TYPE PPI.ACUMULADO_PRIORIDAD_TYPE;
DROP FUNCTION PPI.OBTENER_ACUMULADO_PRIORIDAD_X_PERIODO_ANUAL;



--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 01: Crear TIPO de tipo de dato APD_TYPE
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE TYPE PPI.ACUMULADO_PRIORIDAD_TYPE AS OBJECT (
    PRIORIDAD_ESTRATEGICA_PMP                    NUMBER,
    ACUMULADO_PRIORIDAD                          NUMBER
);

GRANT EXECUTE ON PPI.ACUMULADO_PRIORIDAD_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 02: Crear TABLA de tipo de dato PROGRAMACION_TYPE
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE TYPE PPI.ACUMULADO_PRIORIDAD_TABLE_TYPE AS TABLE OF ACUMULADO_PRIORIDAD_TYPE;

GRANT EXECUTE ON PPI.ACUMULADO_PRIORIDAD_TABLE_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 03: Crear FUNCIÓN
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
CREATE OR REPLACE FUNCTION  PPI.OBTENER_ACUMULADO_PRIORIDAD_X_PERIODO_ANUAL(
    periodoAnual IN NUMBER
)
RETURN ACUMULADO_PRIORIDAD_TABLE_TYPE PIPELINED AS

BEGIN

    FOR rec IN (
            SELECT 
                PEPMP.ID_PRIORIDAD_ESTRATEGICA_PMP,
                NVL(AVG(ACUMULADO_METAPMP.ACUMULADO_METAPMP),0) AS ACUMULADO_PRIORIDAD
            FROM 
            PRIORIDAD_ESTRATEGICA_PMP PEPMP
            INNER JOIN DETALLE_PMP DPMP ON (DPMP.PRIORIDAD_ESTRATEGICA_PMP = PEPMP.ID_PRIORIDAD_ESTRATEGICA_PMP)
            INNER JOIN META_PMP MPMP ON (MPMP.DETALLE_PMP = DPMP.ID_DETALLE_PMP)
            
            --ACUMULADO METAPMP
            INNER JOIN (
                SELECT * FROM TABLE(PPI.OBTENER_ACUMULADO_METAPMP_X_PERIODO_ANUAL(periodoAnual))
            ) ACUMULADO_METAPMP ON MPMP.ID_META_PMP = ACUMULADO_METAPMP.META_PMP
            GROUP BY 
              PEPMP.ID_PRIORIDAD_ESTRATEGICA_PMP
            ORDER BY
            PEPMP.ID_PRIORIDAD_ESTRATEGICA_PMP
    ) 
    LOOP
    PIPE ROW (ACUMULADO_PRIORIDAD_TYPE(rec.ID_PRIORIDAD_ESTRATEGICA_PMP,rec.ACUMULADO_PRIORIDAD));
   END LOOP;

    DBMS_OUTPUT.PUT_LINE('DEBUG: periodoAnual: ' || periodoAnual);
    
    RETURN;

END OBTENER_ACUMULADO_PRIORIDAD_X_PERIODO_ANUAL;



--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 04: GRANTS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++

--***********************************************
-- GRANT'S
--***********************************************
GRANT EXECUTE ON  PPI.OBTENER_ACUMULADO_PRIORIDAD_X_PERIODO_ANUAL TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;


--+++++++++++++++++++++++++++++++++++++++++++++++++++++
--PASO 05: CONSULTAR DATOS
--+++++++++++++++++++++++++++++++++++++++++++++++++++++
SELECT * FROM TABLE(PPI.OBTENER_ACUMULADO_PRIORIDAD_X_PERIODO_ANUAL(:periodoAnual));

CONSULTA DE LA VISTA

  • Ahora que tenemos las funciones creadas vamos a crear la consulta
  • O descargar el archivo: aquí
  • NOTA IMPORTANTE: las vista no llevan parámetros obtienen todos los datos a nivel de código se filtran
--************************************************************
-- FUNCION: Obtener los datos de la vista solicitada
-- VERSION: 1.0.10
--************************************************************
SELECT
    DISTINCT
    EJE_PLP.CODIGO                              EJE_PLP_CODIGO,
    EJE_PLP.DESCRIPCION                         EJE_PLP_DESCRIPCION,
    OBJ_PLP.CODIGO                              OBJ_PLP_CODIGO,
    OBJ_PLP.DESCRIPCION                         OBJ_PLP_DESCRIPCION,
    EJE_TRA.CODIGO                              EJE_TRA_CODIGO,
    EJE_TRA.DESCRIPCION                         EJE_TRA_DESCRIPCION,
    PRI_PMP.CODIGO                              PRI_PMP_CODIGO,
    PRI_PMP.DESCRIPCION                         PRI_PMP_DESCRIPCION,
    ACUMULADO_PRIORIDAD.ACUMULADO_PRIORIDAD     ACUMULADO_PRIORIDAD,
    OBJ_PMP.CODIGO                              OBJ_PMP_CODIGO,
    OBJ_PMP.DESCRIPCION                         OBJ_PMP_DESCRIPCION,
    MPMP.CODIGO                                 MPMP_CODIGO,
    MPMP.DESCRIPCION                            MPMP_DESCRIPCION, 
    ACUMULADO_METAPMP.ACUMULADO_METAPMP         ACUMULADO_METAPMP,
    AAU.NOMBRE                                  AMBITO_ACCION_UNIVERITARIA,
    UE_EM.NOMBRE                                ENCARGADO_MONITOERO,
    EPES.CODIGO                                 EPES_CODIGO,
    EPES.NOMBRE                                 EPES_NOMBRE,
    TEPES.NOMBRE                                TEPES_NOMBRE,
    OPDS.CODIGO                                 OPDS_CODIGO,
    OPDS.NOMBRE                                 OPDS_NOMBRE,
    UE_PACE.NOMBRE                              UE_PACE_NOMBRE,
    ACE.CODIGO                                  ACE_CODIGO,
    ACE.DESCRIPCION                             ACE_DESCRIPCION,
    ACUMULADO_ACCION.ACUMULADO_ACCION           ACUMULADO_ACCION,    
    UE_PAPE.NOMBRE                              UE_PAPE_NOMBRE,
    APE.CODIGO                                  APE_CODIGO,
    APE.DESCRIPCION                             APE_DESCRIPCION,
    APE.CUANTIFICACION                          CUANTIFICACION,
    APE.LINEA_BASE                              LINEA_BASE,
    FR.NOMBRE                                   FUENTE_RECURSO,
    APE.JORNADA                                 JORNADA,
    APD.ANNO_1                                  DISTRIBUCION_1,
    APD.ANNO_2                                  DISTRIBUCION_2,
    APD.ANNO_3                                  DISTRIBUCION_3,
    APD.ANNO_4                                  DISTRIBUCION_4,
    APD.ANNO_5                                  DISTRIBUCION_5,
    PROGRAMACION.CANTIDAD_APORTES               CANTIDAD_APORTES,
    PROGRAMACION.REPRESENTATIVIDAD              REPRESENTATIVIDAD,
    PROGRAMACION.PROGRAMACION                   PROGRAMACION,
    PROMEDIO.PROMEDIO                           PROMEDIO,
    EJECUCION.EJECUCION                         EJECUCION,
    ACUMULADO.ACUMULADO                         ACUMULADO_APORTE
FROM 
META_POA_EVALUACION                         MPE
INNER JOIN META_POA                         MP          ON (MP.ID_META_POA                          =   MPE.META_POA)
INNER JOIN OBJETIVO_POA                     OP          ON (OP.ID_OBJETIVO_POA                      =   MP.OBJETIVO_POA)
INNER JOIN PLAN_OPERATIVO                   PO          ON (PO.ID_PLAN_OPERATIVO                    =   OP.PLAN_OPERATIVO)
INNER JOIN UNIDAD_EJECUTORA                 UE_PO       ON (UE_PO.ID_UNIDAD_EJECUTORA               =   PO.UNIDAD_EJECUTORA)
INNER JOIN EVALUACION_OPERATIVA             EO          ON (EO.PLAN_OPERATIVO                       =   PO.ID_PLAN_OPERATIVO)
INNER JOIN META_POA_APORTE                  MPA         ON (MPA.META_POA                            =   MP.ID_META_POA)
INNER JOIN APORTE_ESTRATEGICO               APE         ON (APE.ID_APORTE_ESTRATEGICO               =   MPA.APORTE_ESTRATEGICO)
INNER JOIN PLAN_APORTE_ESTRATEGICO          PAPE        ON (PAPE.ID_PLAN_APORTE_ESTRATEGICO         =   APE.PLAN_APORTE_ESTRATEGICO)
INNER JOIN UNIDAD_EJECUTORA                 UE_PAPE     ON (UE_PAPE.ID_UNIDAD_EJECUTORA             =   PAPE.UNIDAD_EJECUTORA)
LEFT JOIN  APORTE_PAE_FUENTE_RECURSO        APAEFR      ON (APAEFR.APORTE_ESTRATEGICO               =   APE.ID_APORTE_ESTRATEGICO) --FALTAN
LEFT JOIN  FUENTE_RECURSO                   FR          ON (FR.ID_FUENTE_RECURSO                    =   APAEFR.FUENTE_RECURSO) --FALTAN
INNER JOIN ACCION_ESTRATEGICA               ACE         ON (ACE.ID_ACCION_ESTRATEGICA               =   APE.ACCION_ESTRATEGICA)
INNER JOIN PLAN_ACCION_ESTRATEGICA          PACE        ON (PACE.ID_PLAN_ACCION_ESTRATEGICA         =   ACE.PLAN_ACCION_ESTRATEGICA)
INNER JOIN UNIDAD_EJECUTORA                 UE_PACE     ON (UE_PACE.ID_UNIDAD_EJECUTORA             =   PACE.UNIDAD_EJECUTORA)
INNER JOIN META_PMP                         MPMP        ON (MPMP.ID_META_PMP                        =   ACE.META_PMP)
INNER JOIN AMBITO_ACCION_UNIVERSITARIA      AAU         ON (AAU.ID_AMBITO_ACCION_UNIVERSITARIA      =   MPMP.AMBITO_ACCION_UNIVERSITARIA)
INNER JOIN ENCARGADO_MONITOREO              EM          ON (EM.ID_ENCARGADO_MONITOREO               =   MPMP.ENCARGADO_MONITOREO)
INNER JOIN UNIDAD_EJECUTORA                 UE_EM       ON (UE_EM.ID_UNIDAD_EJECUTORA               =   EM.UNIDAD_EJECUTORA)
LEFT  JOIN META_PMP_EJE_PES                 MPEP        ON (MPEP.META_PMP                           =   MPMP.ID_META_PMP) --VACIA
LEFT  JOIN EJE_PES                          EPES        ON (EPES.ID_EJE_PES                         =   MPEP.EJE_PES)
LEFT  JOIN TIPO_EJE_PES                     TEPES       ON (TEPES.ID_TIPO_EJE_PES                   =   EPES.TIPO_EJE_PES)
LEFT  JOIN META_PMP_OBJETIVO_PDS            MPOPDS      ON (MPOPDS.META_PMP                         =   MPMP.ID_META_PMP) --VACIA
LEFT  JOIN OBJETIVO_PDS                     OPDS        ON (OPDS.ID_OBJETIVO_PDS                    =   MPOPDS.OBJETIVO_PDS)
INNER JOIN DETALLE_PMP                      DET_PMP     ON (DET_PMP.ID_DETALLE_PMP                  =   MPMP.DETALLE_PMP)
INNER JOIN PRIORIDAD_ESTRATEGICA_PMP        PRI_PMP     ON (PRI_PMP.ID_PRIORIDAD_ESTRATEGICA_PMP    =   DET_PMP.PRIORIDAD_ESTRATEGICA_PMP)
INNER JOIN OBJETIVO_ESTRATEGICO_PMP         OBJ_PMP     ON (OBJ_PMP.ID_OBJETIVO_ESTRATEGICO_PMP     =   DET_PMP.OBJETIVO_ESTRATEGICO_PMP)
INNER JOIN EJE_ESTRATEGICO_PLP              EJE_PLP     ON (EJE_PLP.ID_EJE_ESTRATEGICO_PLP          =   DET_PMP.EJE_ESTRATEGICO_LARGO_PLAZO)
INNER JOIN DETALLE_PLP                      DET_PLP     ON (DET_PLP.EJE_ESTRATEGICO_PLP             =   EJE_PLP.ID_EJE_ESTRATEGICO_PLP)   
INNER JOIN OBJETIVO_ESTRATEGICO_PLP         OBJ_PLP     ON (OBJ_PLP.ID_OBJETIVO_ESTRATEGICO_PLP     =   DET_PLP.OBJETIVO_ESTRATEGICO_PLP)
INNER JOIN DETALLE_PLP_EJE_TRANSVERSAL      DET_EJE_TRA ON (DET_EJE_TRA.DETALLE_PLP                 =   DET_PLP.ID_DETALLE_PLP)
LEFT  JOIN EJE_TRANSVERSAL_PLP              EJE_TRA     ON (EJE_TRA.ID_EJE_TRANSVERSAL_PLP          =   DET_EJE_TRA.EJE_TRANSVERSAL_PLP) --VACIA
INNER JOIN PLAN_LARGO_PLAZO                 PLP         ON (PLP.ID_PLAN_LARGO_PLAZO                 =   DET_PLP.PLAN_LARGO_PLAZO)

--METAS FUNCIONALES
INNER JOIN (SELECT *
        FROM TABLE(PPI.OBTENER_METAS_OPE_FUNCIONALES_X_PERIODO_ANUAL(:periodoAnual))
) METAS_FUNCIONALES on MPE.META_POA = METAS_FUNCIONALES.META_POA

-- DISTRIBUCION PORCENTUAL
INNER JOIN (
    SELECT * FROM TABLE(PPI.OBTENER_APD_X_PERIODO_ANUAL(:periodoAnual))
) APD ON APE.ID_APORTE_ESTRATEGICO = APD.APORTE_ESTRATEGICO

-- PROGRAMACION
INNER JOIN (
    SELECT * FROM TABLE(PPI.OBTENER_PROGRAMACION_X_PERIODO_ANUAL(:periodoAnual))
) PROGRAMACION ON APE.ID_APORTE_ESTRATEGICO = PROGRAMACION.APORTE_ESTRATEGICO

--***************************************
-- A PARTIR DE SE REQUIERE LA ETAPA_PLAN 
--***************************************

-- PROMEDIO
INNER JOIN (
    SELECT * FROM TABLE(PPI.OBTENER_PROMEDIO_AVANCE_APORTE_X_PERIODO_ANUAL(:periodoAnual))
) PROMEDIO ON APE.ID_APORTE_ESTRATEGICO = PROMEDIO.APORTE_ESTRATEGICO AND MPE.ETAPA_PLAN = PROMEDIO.ETAPA_PLAN

--EJECUCION
INNER JOIN (
    SELECT * FROM TABLE(PPI.OBTENER_EJECUCION_X_PERIODO_ANUAL(:periodoAnual))
) EJECUCION ON APE.ID_APORTE_ESTRATEGICO = EJECUCION.APORTE_ESTRATEGICO AND MPE.ETAPA_PLAN = EJECUCION.ETAPA_PLAN

--ACUMULADO APORTE
INNER JOIN (
    SELECT * FROM TABLE(PPI.OBTENER_ACUMULADO_X_PERIODO_ANUAL(:periodoAnual))
) ACUMULADO ON APE.ID_APORTE_ESTRATEGICO = ACUMULADO.APORTE_ESTRATEGICO

--ACUMULADO ACCION
INNER JOIN (
    SELECT * FROM TABLE(PPI.OBTENER_ACUMULADO_ACCION_X_PERIODO_ANUAL(:periodoAnual))
) ACUMULADO_ACCION ON ACE.ID_ACCION_ESTRATEGICA = ACUMULADO_ACCION.ACCION_ESTRATEGICA


--ACUMULADO METAPMP
INNER JOIN (
    SELECT * FROM TABLE(PPI.OBTENER_ACUMULADO_METAPMP_X_PERIODO_ANUAL(:periodoAnual))
) ACUMULADO_METAPMP ON MPMP.ID_META_PMP = ACUMULADO_METAPMP.META_PMP

--ACUMULADO PRIORIDAD
INNER JOIN (
    SELECT * FROM TABLE(PPI.OBTENER_ACUMULADO_PRIORIDAD_X_PERIODO_ANUAL(:periodoAnual))
) ACUMULADO_PRIORIDAD ON ID_PRIORIDAD_ESTRATEGICA_PMP = ACUMULADO_PRIORIDAD.PRIORIDAD_ESTRATEGICA_PMP

WHERE 
PO.PERIODO_ANUAL = :periodoAnual
AND MPE.ETAPA_PLAN = EO.ETAPA_PLAN
ORDER BY 
EJE_PLP.CODIGO,
OBJ_PLP.CODIGO,
EJE_TRA.CODIGO,
PRI_PMP.CODIGO,
OBJ_PMP.CODIGO,
MPMP.CODIGO,
AAU.NOMBRE,
UE_EM.NOMBRE,
EPES.CODIGO,
OPDS.CODIGO,
UE_PACE.NOMBRE,
ACE.CODIGO,
UE_PAPE.NOMBRE,
APE.CODIGO
;