{"id":16055,"date":"2023-11-20T09:37:18","date_gmt":"2023-11-20T15:37:18","guid":{"rendered":"https:\/\/sada.services\/?p=16055"},"modified":"2023-11-24T13:16:46","modified_gmt":"2023-11-24T19:16:46","slug":"oracle-crear-funcion-que-retorne-una-tabla-dataset","status":"publish","type":"post","link":"https:\/\/sada.services\/?p=16055","title":{"rendered":"ORACLE: Crear funci\u00f3n que retorne una tabla DataSet"},"content":{"rendered":"\n<ul class=\"wp-block-list\">\n<li>guia: <a href=\"https:\/\/tipsfororacle.blogspot.com\/2017\/03\/returning-table-from-function.html\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/tipsfororacle.blogspot.com\/2017\/03\/returning-table-from-function.html<\/a><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">FUNCION OBTENER_METAS_OPE_FUNCIONALES_X_PERIODO_ANUAL<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Primero vamos a crear una consulta que devuelve una lista de meta_poa funcionales<\/li>\n\n\n\n<li>CONSULTA<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>--************************************************************\n-- FUNCION: Obtener los datos de la vista solicitada\n-- VERSION: 1.0.1\n--************************************************************SELECT\nSELECT\n    MPE.META_POA\nFROM \nMETA_POA_EVALUACION                 MPE\nINNER JOIN META_POA                 MP      ON (MP.ID_META_POA                      =   MPE.META_POA)\nINNER JOIN OBJETIVO_POA             OP      ON (OP.ID_OBJETIVO_POA                  =   MP.OBJETIVO_POA)\nINNER JOIN PLAN_OPERATIVO           PO      ON (PO.ID_PLAN_OPERATIVO                =   OP.PLAN_OPERATIVO)\nINNER JOIN UNIDAD_EJECUTORA         UE_PO   ON (UE_PO.ID_UNIDAD_EJECUTORA           =   PO.UNIDAD_EJECUTORA)\nINNER JOIN EVALUACION_OPERATIVA     EO      ON (EO.PLAN_OPERATIVO                   =   PO.ID_PLAN_OPERATIVO)\nWHERE \nPO.PERIODO_ANUAL = :periodoAnual\nAND PO.ESTADO_FORMULACION_OPE IN (SELECT VALOR FROM PARAMETRO WHERE LLAVE = 'param_ppi_ppo_estadoFormulacionOpe_aprobado_unSoloNivel' OR LLAVE = 'param_ppi_ppo_estadoFormulacionOpe_aprobado_unidad_integradora')\nAND PO.TIPO_PLAN_OPERATIVO = (SELECT VALOR FROM PARAMETRO WHERE LLAVE = 'param_ppi_ppo_tipoPlanOperativo_unidad')\nAND EO.ESTADO_EVALUACION_POA IN (SELECT VALOR FROM PARAMETRO WHERE LLAVE = 'param_ppi_ppo_estadoEvaluacionPOA_aprobado_unSoloNivel' OR LLAVE = 'param_ppi_ppo_estadoEvaluacionPOA_aprobado_unidad_integradora')\nAND MPE.ETAPA_PLAN = EO.ETAPA_PLAN\nAND EO.FECHA_APROBACION = (\n    SELECT \n    MAX(EO.FECHA_APROBACION) \n    FROM \n    EVALUACION_OPERATIVA EO1\n    INNER JOIN PLAN_OPERATIVO PO1 ON (PO1.ID_PLAN_OPERATIVO = EO1.PLAN_OPERATIVO)\n    WHERE \n    PO1.ID_PLAN_OPERATIVO = PO.ID_PLAN_OPERATIVO\n    AND PO1.UNIDAD_EJECUTORA = PO.UNIDAD_EJECUTORA\n)\nORDER BY \nMPE.META_POA;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Como vemos debemos devolver un lista de meta_poas<\/li>\n\n\n\n<li>Lo primero que creamos es la eliminaci\u00f3n de datos<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>--+++++++++++++++++++++++++++++++++++++++++++++++++++++\n-- PASO 0: ELIMINACI\u00d3N DE DATOS\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\nDROP TYPE PPI.META_POA_TABLE_TYPE;\nDROP TYPE PPI.META_POA_TYPE;\nDROP FUNCTION PPI.OBTENER_METAS_OPE_FUNCIONALES_X_PERIODO_ANUAL;\nDROP SYNONYM OBTENER_METAS_OPE_FUNCIONALES_X_PERIODO_ANUAL;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Luego creamos un un tipo de dato metapoatype que es un objeto con un n\u00famero<\/li>\n\n\n\n<li>Lo ejecutamos una ventana independiente<\/li>\n\n\n\n<li><strong>NOTA: se debe poner el el esquema PPI<\/strong><\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>--+++++++++++++++++++++++++++++++++++++++++++++++++++++\n--PASO 01: Crear TIPO de tipo de dato META_POA\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\nCREATE OR REPLACE TYPE PPI.META_POA_TYPE AS OBJECT (\n    META_POA NUMBER\n);\n\nGRANT EXECUTE ON PPI.META_POA_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Luego en otra ventana creamos una tabla de ese tipo<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>--+++++++++++++++++++++++++++++++++++++++++++++++++++++\n--PASO 02: Crear TABLA de tipo de dato MetaPoaType\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\nCREATE OR REPLACE TYPE PPI.META_POA_TABLE_TYPE AS TABLE OF META_POA_TYPE;\n\nGRANT EXECUTE ON PPI.META_POA_TABLE_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Quedando as\u00ed:<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"276\" height=\"119\" src=\"https:\/\/sada.services\/wp-content\/uploads\/2023\/11\/Seleccion_897.png\" alt=\"\" class=\"wp-image-16065\"\/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Con esto podemos crear la funci\u00f3n<\/li>\n\n\n\n<li>NOTA: importante poner el esquema PPI<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>--+++++++++++++++++++++++++++++++++++++++++++++++++++++\n--PASO 03: Crear FUNCI\u00d3N\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\nCREATE OR REPLACE FUNCTION  PPI.OBTENER_METAS_OPE_FUNCIONALES_X_PERIODO_ANUAL(\n    periodoAnual IN NUMBER\n)\nRETURN META_POA_TABLE_TYPE PIPELINED AS\n\nBEGIN\n    FOR rec IN (\n        SELECT MPE.META_POA\n        FROM META_POA_EVALUACION MPE\n        INNER JOIN META_POA MP ON (MP.ID_META_POA = MPE.META_POA)\n        INNER JOIN OBJETIVO_POA OP ON (OP.ID_OBJETIVO_POA = MP.OBJETIVO_POA)\n        INNER JOIN PLAN_OPERATIVO PO ON (PO.ID_PLAN_OPERATIVO = OP.PLAN_OPERATIVO)\n        INNER JOIN UNIDAD_EJECUTORA UE_PO ON (UE_PO.ID_UNIDAD_EJECUTORA = PO.UNIDAD_EJECUTORA)\n        INNER JOIN EVALUACION_OPERATIVA EO ON (EO.PLAN_OPERATIVO = PO.ID_PLAN_OPERATIVO)\n        WHERE PO.PERIODO_ANUAL = periodoAnual\n        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'))\n        AND PO.TIPO_PLAN_OPERATIVO = (SELECT VALOR FROM PARAMETRO WHERE LLAVE = 'param_ppi_ppo_tipoPlanOperativo_unidad')\n        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'))\n        AND MPE.ETAPA_PLAN = EO.ETAPA_PLAN\n        AND EO.FECHA_APROBACION = (\n            SELECT \n            MAX(EO.FECHA_APROBACION) \n            FROM \n            EVALUACION_OPERATIVA EO1\n            INNER JOIN PLAN_OPERATIVO PO1 ON (PO1.ID_PLAN_OPERATIVO = EO1.PLAN_OPERATIVO)\n            WHERE \n            PO1.ID_PLAN_OPERATIVO = PO.ID_PLAN_OPERATIVO\n            AND PO1.UNIDAD_EJECUTORA = PO.UNIDAD_EJECUTORA\n        )\n        ORDER BY MPE.META_POA\n    ) LOOP\n        PIPE ROW (META_POA_TYPE(rec.META_POA));\n    END LOOP;\n\n    RETURN;\n\nEND OBTENER_METAS_OPE_FUNCIONALES_X_PERIODO_ANUAL;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Luego debemos crearle el sinonimo y grants<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>--+++++++++++++++++++++++++++++++++++++++++++++++++++++\n--PASO 04: GRANTS MetaPoa\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\n\n--***********************************************\n-- GRANT'S\n--***********************************************\nGRANT EXECUTE ON PPI.OBTENER_METAS_OPE_FUNCIONALES_X_PERIODO_ANUAL TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Y con esto podemos ejecutar un select que obtenga los datos<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>--+++++++++++++++++++++++++++++++++++++++++++++++++++++\n--PASO 05: CONSULTAR DATOS\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\nSELECT * FROM TABLE(OBTENER_METAS_OPE_FUNCIONALES_X_PERIODO_ANUAL(202));<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Y hacer fuciones de tablas, por ejemplo<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>--************************************************************\n--SELECT PARA OBTENER LOS PERIODOS_ANUALES DE APORTES POR PERIODO ANUAL\n--************************************************************\nSELECT \nDISTINCT\nAPD.PERIODO_ANUAL\nFROM\nMETA_POA_APORTE MPAP\nINNER JOIN (SELECT *\nFROM TABLE(OBTENER_METAS_OPE_FUNCIONALES_X_PERIODO_ANUAL(:periodoAnual))) METAS_FUNCIONAES on MPAP.META_POA = METAS_FUNCIONAES.META_POA\nINNER JOIN APORTE_ESTRATEGICO APE ON (APE.ID_APORTE_ESTRATEGICO = MPAP.APORTE_ESTRATEGICO)\nINNER JOIN APORTE_PAE_DISTRIBUCION APD ON (APD.APORTE_ESTRATEGICO = APE.ID_APORTE_ESTRATEGICO)\nORDER BY APD.PERIODO_ANUAL;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>RESUMEN<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>--*******************************************************************************\n--*******************************************************************************\n-- FUNCI\u00d3N: OBTENER_METAS_OPE_FUCIONALES_X_PERIODO_ANUAL\n--*******************************************************************************\n--*******************************************************************************\n\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\n-- PASO 0: ELIMINACI\u00d3N DE DATOS\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\nDROP TYPE PPI.META_POA_TABLE_TYPE;\nDROP TYPE PPI.META_POA_TYPE;\nDROP FUNCTION PPI.OBTENER_METAS_OPE_FUNCIONALES_X_PERIODO_ANUAL;\nDROP SYNONYM OBTENER_METAS_OPE_FUNCIONALES_X_PERIODO_ANUAL;\n\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\n--PASO 01: Crear TIPO de tipo de dato META_POA\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\nCREATE OR REPLACE TYPE PPI.META_POA_TYPE AS OBJECT (\n    META_POA NUMBER\n);\n\nGRANT EXECUTE ON PPI.META_POA_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;\n\n\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\n--PASO 02: Crear TABLA de tipo de dato MetaPoaType\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\nCREATE OR REPLACE TYPE PPI.META_POA_TABLE_TYPE AS TABLE OF META_POA_TYPE;\n\nGRANT EXECUTE ON PPI.META_POA_TABLE_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;\n\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\n--PASO 03: Crear FUNCI\u00d3N\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\nCREATE OR REPLACE FUNCTION  PPI.OBTENER_METAS_OPE_FUNCIONALES_X_PERIODO_ANUAL(\n    periodoAnual IN NUMBER\n)\nRETURN META_POA_TABLE_TYPE PIPELINED AS\n\nBEGIN\n    FOR rec IN (\n        SELECT MPE.META_POA\n        FROM META_POA_EVALUACION MPE\n        INNER JOIN META_POA MP ON (MP.ID_META_POA = MPE.META_POA)\n        INNER JOIN OBJETIVO_POA OP ON (OP.ID_OBJETIVO_POA = MP.OBJETIVO_POA)\n        INNER JOIN PLAN_OPERATIVO PO ON (PO.ID_PLAN_OPERATIVO = OP.PLAN_OPERATIVO)\n        INNER JOIN UNIDAD_EJECUTORA UE_PO ON (UE_PO.ID_UNIDAD_EJECUTORA = PO.UNIDAD_EJECUTORA)\n        INNER JOIN EVALUACION_OPERATIVA EO ON (EO.PLAN_OPERATIVO = PO.ID_PLAN_OPERATIVO)\n        WHERE PO.PERIODO_ANUAL = periodoAnual\n        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'))\n        AND PO.TIPO_PLAN_OPERATIVO = (SELECT VALOR FROM PARAMETRO WHERE LLAVE = 'param_ppi_ppo_tipoPlanOperativo_unidad')\n        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'))\n        AND MPE.ETAPA_PLAN = EO.ETAPA_PLAN\n        AND EO.FECHA_APROBACION = (\n            SELECT \n            MAX(EO.FECHA_APROBACION) \n            FROM \n            EVALUACION_OPERATIVA EO1\n            INNER JOIN PLAN_OPERATIVO PO1 ON (PO1.ID_PLAN_OPERATIVO = EO1.PLAN_OPERATIVO)\n            WHERE \n            PO1.ID_PLAN_OPERATIVO = PO.ID_PLAN_OPERATIVO\n            AND PO1.UNIDAD_EJECUTORA = PO.UNIDAD_EJECUTORA\n        )\n        ORDER BY MPE.META_POA\n    ) LOOP\n        PIPE ROW (META_POA_TYPE(rec.META_POA));\n    END LOOP;\n\n    RETURN;\n\nEND OBTENER_METAS_OPE_FUNCIONALES_X_PERIODO_ANUAL;\n\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\n--PASO 04: GRANTS MetaPoa\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\n\n--***********************************************\n-- GRANT'S\n--***********************************************\nGRANT EXECUTE ON PPI.OBTENER_METAS_OPE_FUNCIONALES_X_PERIODO_ANUAL TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;\n\n\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\n--PASO 05: CONSULTAR DATOS\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\nSELECT * FROM TABLE(OBTENER_METAS_OPE_FUNCIONALES_X_PERIODO_ANUAL(202));<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">FUNCION OBTENER_PERIODOS_ANUALES_DISTRIBUCION_X_PERIODO_ANUAL<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora vamos a crear una funci\u00f3n que obtenga los distintos periodos anales de la tabla APORTE_PAE_DISTRIBUCION para las metatas funcionales (por lo uqe requiere el periodoAnual)<\/li>\n\n\n\n<li>CONSULTA<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>--************************************************************\n--SELECT PARA OBTENER LOS PERIODOS_ANUALES DE APORTES POR PERIODO ANUAL\n--************************************************************\nSELECT \nDISTINCT\nAPD.PERIODO_ANUAL\nFROM\nMETA_POA_APORTE MPAP\nINNER JOIN (SELECT *\nFROM TABLE(PPI.OBTENER_METAS_OPE_FUNCIONALES_X_PERIODO_ANUAL(:periodoAnual))) METAS_FUNCIONAES on MPAP.META_POA = METAS_FUNCIONAES.META_POA\nINNER JOIN APORTE_ESTRATEGICO APE ON (APE.ID_APORTE_ESTRATEGICO = MPAP.APORTE_ESTRATEGICO)\nINNER JOIN APORTE_PAE_DISTRIBUCION APD ON (APD.APORTE_ESTRATEGICO = APE.ID_APORTE_ESTRATEGICO)\nORDER BY APD.PERIODO_ANUAL;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>ELIMINACI\u00d3N<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>--+++++++++++++++++++++++++++++++++++++++++++++++++++++\n-- PASO 0: ELIMINACI\u00d3N DE DATOS\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\nDROP TYPE PPI.PERIODO_ANUAL_TABLE_TYPE;\nDROP TYPE PPI.PERIODO_ANUAL_TYPE;\nDROP FUNCTION PPI.OBTENER_PERIODO_ANUAL_DISTRIBUCION_X_PERIODO_ANUAL;\nDROP SYNONYM OBTENER_PERIODO_ANUAL_DISTRIBUCION_X_PERIODO_ANUAL;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>TIPO PERIODO_ANUAL<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>--+++++++++++++++++++++++++++++++++++++++++++++++++++++\n--PASO 01: Crear TIPO de tipo de dato PERIODO_ANUAL_TYPE\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\nCREATE OR REPLACE TYPE PPI.PERIODO_ANUAL_TYPE AS OBJECT (\n    PERIODO_ANUAL NUMBER\n);\n\nGRANT EXECUTE ON PPI.PERIODO_ANUAL_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>   SELECT * FROM TABLE(PPI.OBTENER_APD_X_PERIODDO_ANUAL(:periodoAnual))TABLA: PERIODO ANUAL<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>--+++++++++++++++++++++++++++++++++++++++++++++++++++++\n--PASO 02: Crear TABLA de tipo de dato PERIODO_ANUAL_TYPE\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\nCREATE OR REPLACE TYPE PPI.PERIODO_ANUAL_TABLE_TYPE AS TABLE OF PERIODO_ANUAL_TYPE;\n\nGRANT EXECUTE ON PPI.PERIODO_ANUAL_TABLE_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>FUNCI\u00d3N<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>--+++++++++++++++++++++++++++++++++++++++++++++++++++++\n--PASO 03: Crear FUNCI\u00d3N\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\nCREATE OR REPLACE FUNCTION  PPI.OBTENER_PERIODO_ANUAL_DISTRIBUCION_X_PERIODO_ANUAL(\n    periodoAnual IN NUMBER\n)\nRETURN PERIODO_ANUAL_TABLE_TYPE PIPELINED AS\n\nBEGIN\n    FOR rec IN (\n        SELECT \n        DISTINCT\n        APD.PERIODO_ANUAL\n        FROM\n        META_POA_APORTE MPAP\n        INNER JOIN (SELECT *\n        FROM TABLE(PPI.OBTENER_METAS_OPE_FUNCIONALES_X_PERIODO_ANUAL(periodoAnual))) METAS_FUNCIONALES on MPAP.META_POA = METAS_FUNCIONALES.META_POA\n        INNER JOIN APORTE_ESTRATEGICO APE ON (APE.ID_APORTE_ESTRATEGICO = MPAP.APORTE_ESTRATEGICO)\n        INNER JOIN APORTE_PAE_DISTRIBUCION APD ON (APD.APORTE_ESTRATEGICO = APE.ID_APORTE_ESTRATEGICO)\n        ORDER BY APD.PERIODO_ANUAL\n    ) LOOP\n        PIPE ROW (PERIODO_ANUAL_TYPE(rec.PERIODO_ANUAL));\n    END LOOP;\n\n    RETURN;\n\nEND OBTENER_PERIODO_ANUAL_DISTRIBUCION_X_PERIODO_ANUAL;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>SINONIMOS Y GRANTS<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>--+++++++++++++++++++++++++++++++++++++++++++++++++++++\n--PASO 04: GRANTS\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\n\nGRANT EXECUTE ON  PPI.OBTENER_PERIODO_ANUAL_DISTRIBUCION_X_PERIODO_ANUAL TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>CONSULTA<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>--+++++++++++++++++++++++++++++++++++++++++++++++++++++\n--PASO 05: CONSULTAR DATOS\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\nSELECT * FROM TABLE(PPI.OBTENER_PERIODO_ANUAL_DISTRIBUCION_X_PERIODO_ANUAL(202));<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>RESUMEN<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>--*******************************************************************************\n--*******************************************************************************\n-- FUNCI\u00d3N: OBTENER_PERIODOS_ANUALES_DISTRIBUCION_X_PERIODO_ANUAL\n--*******************************************************************************\n--*******************************************************************************\n\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\n-- PASO 0: ELIMINACI\u00d3N DE DATOS\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\nDROP TYPE PPI.PERIODO_ANUAL_TABLE_TYPE;\nDROP TYPE PPI.PERIODO_ANUAL_TYPE;\nDROP FUNCTION PPI.OBTENER_PERIODO_ANUAL_DISTRIBUCION_X_PERIODO_ANUAL;\nDROP SYNONYM OBTENER_PERIODO_ANUAL_DISTRIBUCION_X_PERIODO_ANUAL;\n\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\n--PASO 01: Crear TIPO de tipo de dato PERIODO_ANUAL_TYPE\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\nCREATE OR REPLACE TYPE PPI.PERIODO_ANUAL_TYPE AS OBJECT (\n    PERIODO_ANUAL NUMBER\n);\n\nGRANT EXECUTE ON PPI.PERIODO_ANUAL_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;\n\n\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\n--PASO 02: Crear TABLA de tipo de dato PERIODO_ANUAL_TYPE\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\nCREATE OR REPLACE TYPE PPI.PERIODO_ANUAL_TABLE_TYPE AS TABLE OF PERIODO_ANUAL_TYPE;\n\nGRANT EXECUTE ON PPI.PERIODO_ANUAL_TABLE_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;\n\n\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\n--PASO 03: Crear FUNCI\u00d3N\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\nCREATE OR REPLACE FUNCTION  PPI.OBTENER_PERIODO_ANUAL_DISTRIBUCION_X_PERIODO_ANUAL(\n    periodoAnual IN NUMBER\n)\nRETURN PERIODO_ANUAL_TABLE_TYPE PIPELINED AS\n\nBEGIN\n    FOR rec IN (\n        SELECT \n        DISTINCT\n        APD.PERIODO_ANUAL\n        FROM\n        META_POA_APORTE MPAP\n        INNER JOIN (SELECT *\n        FROM TABLE(PPI.OBTENER_METAS_OPE_FUNCIONALES_X_PERIODO_ANUAL(periodoAnual))) METAS_FUNCIONALES on MPAP.META_POA = METAS_FUNCIONALES.META_POA\n        INNER JOIN APORTE_ESTRATEGICO APE ON (APE.ID_APORTE_ESTRATEGICO = MPAP.APORTE_ESTRATEGICO)\n        INNER JOIN APORTE_PAE_DISTRIBUCION APD ON (APD.APORTE_ESTRATEGICO = APE.ID_APORTE_ESTRATEGICO)\n        ORDER BY APD.PERIODO_ANUAL\n    ) LOOP\n        PIPE ROW (PERIODO_ANUAL_TYPE(rec.PERIODO_ANUAL));\n    END LOOP;\n\n    RETURN;\n\nEND OBTENER_PERIODO_ANUAL_DISTRIBUCION_X_PERIODO_ANUAL;\n\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\n--PASO 04: GRANTS\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\n\nGRANT EXECUTE ON  PPI.OBTENER_PERIODO_ANUAL_DISTRIBUCION_X_PERIODO_ANUAL TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;\n\n\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\n--PASO 05: CONSULTAR DATOS\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\nSELECT * FROM TABLE(PPI.OBTENER_PERIODO_ANUAL_DISTRIBUCION_X_PERIODO_ANUAL(202));<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">ADICIONAL: crear una funci\u00f3n que devuelva la consulta<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>La modificamos para que devuelva una string <\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE OR REPLACE FUNCTION OBTENER_APD_X_PERIODDO_ANUAL(\n    periodoAnual IN NUMBER\n)\n--RETURN ANO_TABLE_TYPE PIPELINED AS\nRETURN CLOB IS\n\n\n    -- Almacena los a\u00f1os en un arreglo\n    v_periodos PERIODO_ANUAL_TABLE_TYPE := PERIODO_ANUAL_TABLE_TYPE();\n\n    -- Variable para almacenar el a\u00f1o actual\n    v_periodo PERIODO_ANUAL_TYPE;\n    \n    \n    -- Almacena los a\u00f1os en un arreglo\n    v_anos ANO_TABLE_TYPE := ANO_TABLE_TYPE();\n\n    -- Variable para almacenar el a\u00f1o actual\n    v_ano ANO_TYPE;\n    \n    -- Variable para construir la consulta PIVOT\n    v_sql CLOB;\n\n    -- Variable para almacenar el resultado de la consulta PIVOT\n    v_result SYS_REFCURSOR;\n\n    -- Variables para almacenar los valores din\u00e1micos de las columnas del PIVOT\n    v_valor1 NUMBER;\n    v_valor2 NUMBER;\n    v_valor3 NUMBER;\n    v_valor4 NUMBER;\n    v_valor5 NUMBER;\n\nBEGIN\n    -- Llenar el arreglo con los a\u00f1os\n    FOR rec IN (SELECT ANO, ID_PERIODO_ANUAL\n                FROM PERIODO_ANUAL\n                WHERE ID_PERIODO_ANUAL IN (SELECT PERIODO_ANUAL\n                                           FROM TABLE(OBTENER_PERIODOS_ANUALES_DISTRIBUCION_X_PERIDDO_ANUAL(periodoAnual)))\n                ORDER BY ANO)\n    LOOP\n        -- Utilizar el constructor del tipo ANO_TYPE\n        v_ano := ANO_TYPE(rec.ANO);\n        \n        -- Utilizar el constructor del tipo ANO_TYPE\n        v_periodo := PERIODO_ANUAL_TYPE(rec.ID_PERIODO_ANUAL);\n        \n       -- A\u00f1adir los resultados al arreglo de a\u00f1os\n        v_periodos.EXTEND;\n        v_periodos(v_periodos.LAST) := v_periodo;\n       \n        -- A\u00f1adir los resultados al arreglo de a\u00f1os\n        v_anos.EXTEND;\n        v_anos(v_anos.LAST) := v_ano;\n\n        -- Retornar el objeto usando PIPE ROW\n        --PIPE ROW(v_periodo);\n        --PIPE ROW(v_ano);\n    END LOOP;\n    \n    \n    -- Construir la consulta PIVOT din\u00e1micamente\n    v_sql := 'SELECT * FROM (SELECT APD.APORTE_ESTRATEGICO, APD.PERIODO_ANUAL, APD.DISTRIBUCION_PORCENTUAL ';\n    v_sql := v_sql || 'FROM META_POA_APORTE MPAP ';\n    v_sql := v_sql || 'INNER JOIN (SELECT * FROM TABLE(OBTENER_METAS_OPE_FUNCIONALES_X_PERIODO_ANUAL(:periodoAnual))) METAS_FUNCIONAES ';\n    v_sql := v_sql || 'ON MPAP.META_POA = METAS_FUNCIONAES.META_POA ';\n    v_sql := v_sql || 'INNER JOIN APORTE_ESTRATEGICO APE ON APE.ID_APORTE_ESTRATEGICO = MPAP.APORTE_ESTRATEGICO ';\n    v_sql := v_sql || 'INNER JOIN APORTE_PAE_DISTRIBUCION APD ON APD.APORTE_ESTRATEGICO = APE.ID_APORTE_ESTRATEGICO ';\n    v_sql := v_sql || 'WHERE APD.PERIODO_ANUAL IN (SELECT * FROM TABLE(OBTENER_PERIODOS_ANUALES_DISTRIBUCION_X_PERIDDO_ANUAL(:periodoAnual)))) ';\n    v_sql := v_sql || 'PIVOT (MAX(DISTRIBUCION_PORCENTUAL) FOR PERIODO_ANUAL IN (';\n\n    FOR i IN 1..v_anos.LAST LOOP\n        v_sql := v_sql || v_periodos(i).PERIODO_ANUAL || ' as \"' || v_anos(i).ANO || '\"';\n        IF i &lt; v_anos.LAST THEN\n            v_sql := v_sql || ', ';\n        END IF;\n    END LOOP;\n\n    v_sql := v_sql || ')) ORDER BY APORTE_ESTRATEGICO';\n\n    -- Terminar la funci\u00f3n\n    RETURN v_sql;\n\nEND OBTENER_APD_X_PERIODDO_ANUAL;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Y la mandamos a ejecutar asi<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>SET SERVEROUTPUT ON;\nDECLARE\n  v_query_result VARCHAR2(4000);\nBEGIN\n  v_query_result := PPI.OBTENER_APD_X_PERIODDO_ANUAL(:periodoAnual);\n  DBMS_OUTPUT.PUT_LINE('Resultado de la consulta SQL: ' || v_query_result);\nEND;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">OTRA PARA RETORNAR SELECT<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>create or replace FUNCTION  PPI.GENERAR_SELECT(parametro IN NUMBER)\nRETURN VARCHAR2\nAS\n  v_sql VARCHAR2(4000);\nBEGIN\n  -- Construir la consulta SELECT din\u00e1micamente\n  v_sql := 'SELECT * FROM (\n    SELECT \n        DISTINCT\n        APD.APORTE_ESTRATEGICO,\n        APD.PERIODO_ANUAL,\n        APD.DISTRIBUCION_PORCENTUAL\n    FROM\n    META_POA_APORTE MPAP\n    INNER JOIN (SELECT * FROM TABLE(OBTENER_METAS_OPE_FUNCIONALES_X_PERIODO_ANUAL(:periodoAnual))) METAS_FUNCIONALES on MPAP.META_POA = METAS_FUNCIONAES.META_POA\n    INNER JOIN APORTE_ESTRATEGICO APE ON (APE.ID_APORTE_ESTRATEGICO = MPAP.APORTE_ESTRATEGICO)\n    INNER JOIN APORTE_PAE_DISTRIBUCION APD ON (APD.APORTE_ESTRATEGICO = APE.ID_APORTE_ESTRATEGICO)\n    WHERE \n    APD.PERIODO_ANUAL IN (SELECT * FROM TABLE(OBTENER_PERIODOS_ANUALES_DISTRIBUCION_X_PERIDDO_ANUAL(:periodoAnual))) \n)\nPIVOT (\nMAX(DISTRIBUCION_PORCENTUAL) FOR PERIODO_ANUAL IN (202 as \"2023\",222 as \"2024\",223 as \"2025\",224 as \"2026\",225 as \"2027\")\n)\nORDER BY APORTE_ESTRATEGICO';\n\n  -- Devolver la consulta SELECT como una cadena de texto\n  RETURN v_sql;\nEND GENERAR_SELECT;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">RESPALDO<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>create or replace FUNCTION         OBTENER_DISTRIBUCION_PORCENTUAL_X_APORTE (APORTE_ESTRATEGICO_PARAM IN NUMBER) RETURN SYS_REFCURSOR\nIS\n    RESULTADO SYS_REFCURSOR;\n    SQL_DINAMICO VARCHAR2(4000);\nBEGIN\n    SQL_DINAMICO := 'SELECT APORTE_ESTRATEGICO, ';\n\n    FOR R IN (SELECT DISTINCT PERIODO_ANUAL FROM APORTE_PAE_DISTRIBUCION ORDER BY PERIODO_ANUAL)\n    LOOP\n        SQL_DINAMICO := SQL_DINAMICO || 'MAX(CASE WHEN PERIODO_ANUAL = ''' || R.PERIODO_ANUAL || ''' THEN DISTRIBUCION_PORCENTUAL END) AS \"' || R.PERIODO_ANUAL || '\", ';\n    END LOOP;\n\n    SQL_DINAMICO := RTRIM(SQL_DINAMICO, ', ') || ' FROM APORTE_PAE_DISTRIBUCION WHERE APORTE_ESTRATEGICO = :APORTE_ESTRATEGICO_PARAM GROUP BY APORTE_ESTRATEGICO';\n\n    OPEN RESULTADO FOR SQL_DINAMICO USING APORTE_ESTRATEGICO_PARAM;\n\n    RETURN RESULTADO;\nEND;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">FUNCION OBTENER_APD_X_PERIODDO_ANUAL<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ejemplo de consulta SQL para pruebas<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>--************************************************************\n--SELECT PARA OBTENER LA DISTRIBUCION PORCENTUAL X PERIODO ANUAL\n--************************************************************\nSELECT * FROM (\n    SELECT \n        DISTINCT\n        APD.APORTE_ESTRATEGICO,\n        APD.PERIODO_ANUAL,\n        APD.DISTRIBUCION_PORCENTUAL\n    FROM\n    META_POA_APORTE MPAP\n    INNER JOIN (SELECT * FROM TABLE(PPI.OBTENER_METAS_OPE_FUNCIONALES_X_PERIODO_ANUAL(:periodoAnual))) METAS_FUNCIONALES on MPAP.META_POA = METAS_FUNCIONALES.META_POA\n    INNER JOIN APORTE_ESTRATEGICO APE ON (APE.ID_APORTE_ESTRATEGICO = MPAP.APORTE_ESTRATEGICO)\n    INNER JOIN APORTE_PAE_DISTRIBUCION APD ON (APD.APORTE_ESTRATEGICO = APE.ID_APORTE_ESTRATEGICO)\n    WHERE \n    APD.PERIODO_ANUAL IN (SELECT * FROM TABLE(PPI.OBTENER_PERIODO_ANUAL_DISTRIBUCION_X_PERIODO_ANUAL(:periodoAnual))) \n)\nPIVOT (\nMAX(DISTRIBUCION_PORCENTUAL) FOR PERIODO_ANUAL IN (202 as \"2023\",222 as \"2024\",223 as \"2025\",224 as \"2026\",225 as \"2027\")\n)\nORDER BY APORTE_ESTRATEGICO;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Primero creamos un tipo de datos para el a\u00f1o<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>--*****************************************************\n--COMPONENTE REQUERIDO: A\u00d1O\n--*****************************************************\n\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\n-- PASO 0: ELIMINACI\u00d3N DE DATOS\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\nDROP TYPE PPI.ANO_TABLE_TYPE;\nDROP TYPE PPI.ANO_TYPE;\n\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\n--PASO 01: Crear TIPO de tipo de dato APD_TYPE\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\nCREATE OR REPLACE TYPE PPI.ANO_TYPE AS OBJECT (\n    ANO NUMBER(4)\n);\nGRANT EXECUTE ON PPI.ANO_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;\n\n\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\n--PASO 02: Crear TABLA de tipo de dato ANO_TYPE\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\nCREATE OR REPLACE TYPE PPI.ANO_TABLE_TYPE AS TABLE OF ANO_TYPE;\n\nGRANT EXECUTE ON PPI.ANO_TABLE_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Luego creamos la funci\u00f3n de OBTENER_APD_X_PERIODO_ANUAL<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>--*****************************************************\n--FUNCI\u00d3N: OBTENER_APD_X_PERIODDO_ANUAL\n--*****************************************************\n\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\n-- PASO 0: ELIMINACI\u00d3N DE DATOS\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\nDROP TYPE PPI.APD_TABLE_TYPE;\nDROP TYPE PPI.APD_TYPE;\nDROP FUNCTION PPI.OBTENER_APD_X_PERIODO_ANUAL;\nDROP SYNONYM OBTENER_APD_X_PERIODO_ANUAL;\n\n\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\n--PASO 01: Crear TIPO de tipo de dato APD_TYPE\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\nCREATE OR REPLACE TYPE     APD_TYPE AS OBJECT (\n    APORTE_ESTRATEGICO  NUMBER,\n    ANNO_1              NUMBER,\n    ANNO_2              NUMBER,\n    ANNO_3              NUMBER,\n    ANNO_4              NUMBER,\n    ANNO_5              NUMBER\n);\nGRANT EXECUTE ON PPI.APD_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;\n\n\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\n--PASO 02: Crear TABLA de tipo de dato APD_TYPE\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\nCREATE OR REPLACE TYPE PPI.APD_TABLE_TYPE AS TABLE OF APD_TYPE;\n\nGRANT EXECUTE ON PPI.APD_TABLE_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;\n\n\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\n--PASO 03: Crear FUNCI\u00d3N\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\nCREATE OR REPLACE FUNCTION PPI.OBTENER_APD_X_PERIODO_ANUAL(\n    --periodoAnual: parametro de ingreso\n    periodoAnual IN NUMBER\n)\n--RETURN: tabla virtual de tipo APD_TABLE_TYPE\nRETURN APD_TABLE_TYPE PIPELINED AS\n\n    --***************************************************************\n    --VARIABLES\n    --***************************************************************\n    -- Almacena los a\u00f1os en un arreglo\n    v_periodos  PERIODO_ANUAL_TABLE_TYPE := PERIODO_ANUAL_TABLE_TYPE();\n\n    -- Variable para almacenar el a\u00f1o actual\n    v_periodo PERIODO_ANUAL_TYPE;\n\n\n    -- Almacena los a\u00f1os en un arreglo\n    v_anos ANO_TABLE_TYPE := ANO_TABLE_TYPE();\n\n    -- Variable para almacenar el a\u00f1o actual\n    v_ano ANO_TYPE;\n\n    -- Variable para construir la consulta PIVOT\n    v_sql CLOB;\n\n    -- Variable para almacenar el resultado de la consulta PIVOT\n    v_result SYS_REFCURSOR;\n\n    -- Variables para almacenar los valores din\u00e1micos de las columnas del PIVOT\n    v_aporte NUMBER;\n    v_anno_1 NUMBER;\n    v_anno_2 NUMBER;\n    v_anno_3 NUMBER;\n    v_anno_4 NUMBER;\n    v_anno_5 NUMBER;\n\nBEGIN\n    --***************************************************************\n    --OBTENCI\u00d3N DE DATOS\n    --***************************************************************\n    -- Ejecutar consulta del ID_PERIODO_ANUAL y  ANO para almacenarlos en arreglos para crear el PIVOT \n    FOR rec IN (SELECT ANO, ID_PERIODO_ANUAL\n                FROM PERIODO_ANUAL\n                WHERE ID_PERIODO_ANUAL IN (SELECT PERIODO_ANUAL\n                                           FROM TABLE(PPI.OBTENER_PERIODO_ANUAL_DISTRIBUCION_X_PERIODO_ANUAL(periodoAnual)))\n                ORDER BY ANO)\n    LOOP\n        -- Utilizar el constructor del tipo ANO_TYPE\n        v_ano := ANO_TYPE(rec.ANO);\n\n        -- Utilizar el constructor del tipo ANO_TYPE\n        v_periodo := PERIODO_ANUAL_TYPE(rec.ID_PERIODO_ANUAL);\n\n       -- A\u00f1adir los resultados al arreglo de a\u00f1os\n        v_periodos.EXTEND;\n        v_periodos(v_periodos.LAST) := v_periodo;\n\n        -- A\u00f1adir los resultados al arreglo de a\u00f1os\n        v_anos.EXTEND;\n        v_anos(v_anos.LAST) := v_ano;\n\n    END LOOP;\n\n\n    --**************************************************************\n    --CONSULTA DIN\u00c1MICA\n    --**************************************************************\n    v_sql := 'SELECT * FROM (SELECT APD.APORTE_ESTRATEGICO, APD.PERIODO_ANUAL, APD.DISTRIBUCION_PORCENTUAL ';\n    v_sql := v_sql || 'FROM META_POA_APORTE MPAP ';\n    v_sql := v_sql || 'INNER JOIN (SELECT * FROM TABLE(PPI.OBTENER_METAS_OPE_FUNCIONALES_X_PERIODO_ANUAL(' || periodoAnual || '))) METAS_FUNCIONAES ';\n    v_sql := v_sql || 'ON MPAP.META_POA = METAS_FUNCIONAES.META_POA ';\n    v_sql := v_sql || 'INNER JOIN APORTE_ESTRATEGICO APE ON APE.ID_APORTE_ESTRATEGICO = MPAP.APORTE_ESTRATEGICO ';\n    v_sql := v_sql || 'INNER JOIN APORTE_PAE_DISTRIBUCION APD ON APD.APORTE_ESTRATEGICO = APE.ID_APORTE_ESTRATEGICO ';\n    v_sql := v_sql || 'WHERE APD.PERIODO_ANUAL IN (SELECT * FROM TABLE(PPI.OBTENER_PERIODO_ANUAL_DISTRIBUCION_X_PERIODO_ANUAL(' || periodoAnual || ')))) ';\n    v_sql := v_sql || 'PIVOT (MAX(DISTRIBUCION_PORCENTUAL) FOR PERIODO_ANUAL IN (';\n\n    FOR i IN 1..v_anos.LAST LOOP\n        v_sql := v_sql || v_periodos(i).PERIODO_ANUAL || ' as \"' || v_anos(i).ANO || '\"';\n        IF i &lt; v_anos.LAST THEN\n            v_sql := v_sql || ', ';\n        END IF;\n    END LOOP;\n\n    v_sql := v_sql || ')) ORDER BY APORTE_ESTRATEGICO';\n\n\n    -- Ejecutar la consulta PIVOT\n    OPEN v_result FOR v_sql;\n\n    --**************************************************************\n    --RECUPERAR Y FORMATEAAR LOS DATOS\n    --**************************************************************\n    LOOP\n       FETCH v_result INTO v_aporte,v_anno_1, v_anno_2, v_anno_3, v_anno_4, v_anno_5;\n       EXIT WHEN v_result%NOTFOUND;\n\n       PIPE ROW(APD_TYPE(v_aporte,v_anno_1, v_anno_2, v_anno_3, v_anno_4, v_anno_5));\n    END LOOP;\n\n    CLOSE v_result;\n\n    RETURN;\n\nEND OBTENER_APD_X_PERIODO_ANUAL;\n\n\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\n--PASO 04: GRANTS\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\n\n\n--***********************************************\n-- GRANT'S\n--***********************************************\nGRANT EXECUTE ON  PPI.OBTENER_APD_X_PERIODO_ANUAL TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;\n\n\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\n--PASO 05: CONSULTAR DATOS\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\nSELECT * FROM TABLE(PPI.OBTENER_APD_X_PERIODO_ANUAL(202));<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>RESUMEN<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code><\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Funcion de programacion<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>consulta SQL<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>--************************************************************\n--SELECT PARA OBTENER PROGRAMACION X PERIODO ANUAL\n--************************************************************\nSELECT * FROM (\n    SELECT \n        DISTINCT\n        APD.APORTE_ESTRATEGICO                                          APORTE_ESTRATEGICO,\n        APD.PERIODO_ANUAL                                               PERIODO_ANUAL,\n        APD.DISTRIBUCION_PORCENTUAL*(1 \/ CAN_APO.CANTIDAD_APORTES)      PROGRAMACION,\n        CAN_APO.CANTIDAD_APORTES                                        CANTIDAD_APORTES_X_ACCION,\n        (1 \/ CAN_APO.CANTIDAD_APORTES)                                  REPRESENTATIVIDAD\n    FROM\n    META_POA_APORTE                         MPAP\n    INNER JOIN (SELECT * FROM TABLE(PPI.OBTENER_METAS_OPE_FUNCIONALES_X_PERIODO_ANUAL(:periodoAnual))) METAS_FUNCIONALES on MPAP.META_POA = METAS_FUNCIONALES.META_POA\n    INNER JOIN APORTE_ESTRATEGICO           APE ON (APE.ID_APORTE_ESTRATEGICO = MPAP.APORTE_ESTRATEGICO)\n    INNER JOIN APORTE_PAE_DISTRIBUCION      APD ON (APD.APORTE_ESTRATEGICO = APE.ID_APORTE_ESTRATEGICO)\n    INNER JOIN ACCION_ESTRATEGICA           ACE ON (ACE.ID_ACCION_ESTRATEGICA = APE.ACCION_ESTRATEGICA)\n    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\n    WHERE \n    APD.PERIODO_ANUAL IN (SELECT * FROM TABLE(PPI.OBTENER_PERIODO_ANUAL_DISTRIBUCION_X_PERIODO_ANUAL(:periodoAnual))) \n)\nPIVOT (\nMAX(PROGRAMACION) FOR PERIODO_ANUAL IN (202 as \"2023\",222 as \"2024\",223 as \"2025\",224 as \"2026\",225 as \"2027\")\n)\nORDER BY APORTE_ESTRATEGICO;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>RESUMEN<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>--*******************************************************************************\n--*******************************************************************************\n-- FUNCI\u00d3N: OBTENER_PROGRAMACION_X_PERIODO_ANUAL\n--*******************************************************************************\n--*******************************************************************************\n\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\n-- PASO 0: ELIMINACI\u00d3N DE DATOS\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\nDROP TYPE PPI.PROGRAMACION_TABLE_TYPE;\nDROP TYPE PPI.PROGRAMACION_TYPE;\nDROP FUNCTION PPI.OBTENER_PROGRAMACION_X_PERIODO_ANUAL;\nDROP SYNONYM OBTENER_PROGRAMACION_X_PERIODO_ANUAL;\n\n\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\n--PASO 01: Crear TIPO de tipo de dato APD_TYPE\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\nCREATE OR REPLACE TYPE PPI.PROGRAMACION_TYPE AS OBJECT (\n    APORTE_ESTRATEGICO          NUMBER,\n    CANTIDAD_APORTES            NUMBER,\n    REPRESENTATIVIDAD           NUMBER,\n    PROGRAMACION_1              NUMBER,\n    PROGRAMACION_2              NUMBER,\n    PROGRAMACION_3              NUMBER,\n    PROGRAMACION_4              NUMBER,\n    PROGRAMACION_5              NUMBER\n);\n\nGRANT EXECUTE ON PPI.PROGRAMACION_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;\n\n\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\n--PASO 02: Crear TABLA de tipo de dato PROGRAMACION_TYPE\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\nCREATE OR REPLACE TYPE PPI.PROGRAMACION_TABLE_TYPE AS TABLE OF PROGRAMACION_TYPE;\n\nGRANT EXECUTE ON PPI.PROGRAMACION_TABLE_TYPE TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;\n\n\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\n--PASO 03: Crear FUNCI\u00d3N\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\nCREATE OR REPLACE FUNCTION PPI.OBTENER_PROGRAMACION_X_PERIODO_ANUAL(\n\n    --periodoAnual: parametro de ingreso\n    periodoAnual IN NUMBER\n    \n)\n--RETURN: tabla virtual de tipo APD_TABLE_TYPE\nRETURN PROGRAMACION_TABLE_TYPE PIPELINED AS\n\n    --***************************************************************\n    --VARIABLES\n    --***************************************************************\n    -- Almacena los a\u00f1os en un arreglo\n    v_periodos  PERIODO_ANUAL_TABLE_TYPE := PERIODO_ANUAL_TABLE_TYPE();\n\n    -- Variable para almacenar el a\u00f1o actual\n    v_periodo PERIODO_ANUAL_TYPE;\n\n\n    -- Almacena los a\u00f1os en un arreglo\n    v_anos ANO_TABLE_TYPE := ANO_TABLE_TYPE();\n\n    -- Variable para almacenar el a\u00f1o actual\n    v_ano ANO_TYPE;\n\n    -- Variable para construir la consulta PIVOT\n    v_sql CLOB;\n\n    -- Variable para almacenar el resultado de la consulta PIVOT\n    v_result SYS_REFCURSOR;\n\n    -- Variables para almacenar los valores din\u00e1micos de las columnas del PIVOT\n    v_aporte            NUMBER;\n    v_cantidad_aporte   NUMBER;\n    v_representatividad NUMBER;\n    v_programacion_1    NUMBER;\n    v_programacion_2    NUMBER;\n    v_programacion_3    NUMBER;\n    v_programacion_4    NUMBER;\n    v_programacion_5    NUMBER;\n\nBEGIN\n    --***************************************************************\n    --OBTENCI\u00d3N DE DATOS\n    --***************************************************************\n    -- Ejecutar consulta del ID_PERIODO_ANUAL y  ANO para almacenarlos en arreglos para crear el PIVOT \n    FOR rec IN (SELECT ANO, ID_PERIODO_ANUAL\n                FROM PERIODO_ANUAL\n                WHERE ID_PERIODO_ANUAL IN (SELECT PERIODO_ANUAL\n                                           FROM TABLE(PPI.OBTENER_PERIODO_ANUAL_DISTRIBUCION_X_PERIODO_ANUAL(periodoAnual)))\n                ORDER BY ANO)\n    LOOP\n        -- Utilizar el constructor del tipo ANO_TYPE\n        v_ano := ANO_TYPE(rec.ANO);\n\n        -- Utilizar el constructor del tipo ANO_TYPE\n        v_periodo := PERIODO_ANUAL_TYPE(rec.ID_PERIODO_ANUAL);\n\n       -- A\u00f1adir los resultados al arreglo de a\u00f1os\n        v_periodos.EXTEND;\n        v_periodos(v_periodos.LAST) := v_periodo;\n\n        -- A\u00f1adir los resultados al arreglo de a\u00f1os\n        v_anos.EXTEND;\n        v_anos(v_anos.LAST) := v_ano;\n\n    END LOOP;\n\n\n   v_sql := 'SELECT * FROM ( ';\n    v_sql := v_sql || 'SELECT ';\n    v_sql := v_sql || 'DISTINCT ';\n    v_sql := v_sql || 'APD.APORTE_ESTRATEGICO                                          APORTE_ESTRATEGICO, ';\n    v_sql := v_sql || 'APD.PERIODO_ANUAL                                               PERIODO_ANUAL, ';\n    v_sql := v_sql || 'APD.DISTRIBUCION_PORCENTUAL*(1 \/ CAN_APO.CANTIDAD_APORTES)      PROGRAMACION, ';\n    v_sql := v_sql || 'CAN_APO.CANTIDAD_APORTES                                        CANTIDAD_APORTES_X_ACCION, ';\n    v_sql := v_sql || '(1 \/ CAN_APO.CANTIDAD_APORTES)                                  REPRESENTATIVIDAD';\n    v_sql := v_sql || ' FROM ';\n    v_sql := v_sql || 'META_POA_APORTE                         MPAP ';\n    v_sql := v_sql || 'INNER JOIN (SELECT * FROM TABLE(PPI.OBTENER_METAS_OPE_FUNCIONALES_X_PERIODO_ANUAL(' || periodoAnual || '))) METAS_FUNCIONALES on MPAP.META_POA = METAS_FUNCIONALES.META_POA ';\n    v_sql := v_sql || 'INNER JOIN APORTE_ESTRATEGICO APE ON (APE.ID_APORTE_ESTRATEGICO = MPAP.APORTE_ESTRATEGICO) ';\n    v_sql := v_sql || 'INNER JOIN APORTE_PAE_DISTRIBUCION APD ON (APD.APORTE_ESTRATEGICO = APE.ID_APORTE_ESTRATEGICO) ';\n    v_sql := v_sql || 'INNER JOIN ACCION_ESTRATEGICA ACE ON (ACE.ID_ACCION_ESTRATEGICA = APE.ACCION_ESTRATEGICA) ';\n    v_sql := v_sql || '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 ';\n    v_sql := v_sql || 'WHERE ';\n    v_sql := v_sql || 'APD.PERIODO_ANUAL IN (SELECT * FROM TABLE(PPI.OBTENER_PERIODO_ANUAL_DISTRIBUCION_X_PERIODO_ANUAL(' || periodoAnual || '))) ';\n    v_sql := v_sql || ') ';\n    v_sql := v_sql || 'PIVOT ( ';\n    v_sql := v_sql || 'MAX(PROGRAMACION) FOR PERIODO_ANUAL IN ( ';\n\n\n    -- CONSTRUIR PIVOTEO\n    FOR i IN 1..v_anos.LAST LOOP\n\n        v_sql := v_sql || v_periodos(i).PERIODO_ANUAL || ' as \"' || v_anos(i).ANO || '\"';\n\n        IF i &lt; v_anos.LAST THEN\n            v_sql := v_sql || ', ';\n        END IF;\n    END LOOP;\n\n    v_sql := v_sql || ') ';\n    v_sql := v_sql || ') ';\n    v_sql := v_sql || 'ORDER BY APORTE_ESTRATEGICO';\n    DBMS_OUTPUT.PUT_LINE('DEBUG: v_sql: ' || v_sql);\n\n\n    -- Ejecutar la consulta PIVOT\n    OPEN v_result FOR v_sql;\n\n    --**************************************************************\n    --RECUPERAR Y FORMATEAAR LOS DATOS\n    --**************************************************************\n    LOOP\n       FETCH v_result INTO v_aporte,v_cantidad_aporte, v_representatividad, v_programacion_1, v_programacion_2, v_programacion_3, v_programacion_4, v_programacion_5;\n       EXIT WHEN v_result%NOTFOUND;\n\n       PIPE ROW(PROGRAMACION_TYPE(v_aporte,v_cantidad_aporte, v_representatividad, v_programacion_1, v_programacion_2, v_programacion_3, v_programacion_4, v_programacion_5));\n    END LOOP;\n\n    CLOSE v_result;\n\n    RETURN;\n\nEND OBTENER_PROGRAMACION_X_PERIODO_ANUAL;\n\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\n--PASO 04: GRANTS\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\n\n--***********************************************\n-- GRANT'S\n--***********************************************\nGRANT EXECUTE ON  PPI.OBTENER_PROGRAMACION_X_PERIODO_ANUAL TO WWW_SIGESA,ANALISTA, ANALISTA_SIGESA;\n\n\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\n--PASO 05: CONSULTAR DATOS\n--+++++++++++++++++++++++++++++++++++++++++++++++++++++\nSELECT * FROM TABLE(PPI.OBTENER_PROGRAMACION_X_PERIODO_ANUAL(202));<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>ADEMAS TENEMOS UNA FUNCI\u00d3N PARA LA CONSULTA<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE OR REPLACE FUNCTION PPI.OBTENER_PROGRAMACION_X_PERIODO_ANUAL_CONSULTA(\n\n    --periodoAnual: parametro de ingreso\n    periodoAnual IN NUMBER\n    \n)\n--RETURN: tabla virtual de tipo APD_TABLE_TYPE\nRETURN CLOB IS\n\n    --***************************************************************\n    --VARIABLES\n    --***************************************************************\n    -- Almacena los a\u00f1os en un arreglo\n    v_periodos  PERIODO_ANUAL_TABLE_TYPE := PERIODO_ANUAL_TABLE_TYPE();\n\n    -- Variable para almacenar el a\u00f1o actual\n    v_periodo PERIODO_ANUAL_TYPE;\n\n\n    -- Almacena los a\u00f1os en un arreglo\n    v_anos ANO_TABLE_TYPE := ANO_TABLE_TYPE();\n\n    -- Variable para almacenar el a\u00f1o actual\n    v_ano ANO_TYPE;\n\n    -- Variable para construir la consulta PIVOT\n    v_sql CLOB;\n\n    -- Variable para almacenar el resultado de la consulta PIVOT\n    v_result SYS_REFCURSOR;\n\n    -- Variables para almacenar los valores din\u00e1micos de las columnas del PIVOT\n    v_aporte NUMBER;\n    v_programacion_1 NUMBER;\n    v_programacion_2 NUMBER;\n    v_programacion_3 NUMBER;\n    v_programacion_4 NUMBER;\n    v_programacion_5 NUMBER;\n\nBEGIN\n    --***************************************************************\n    --OBTENCI\u00d3N DE DATOS\n    --***************************************************************\n    -- Ejecutar consulta del ID_PERIODO_ANUAL y  ANO para almacenarlos en arreglos para crear el PIVOT \n    FOR rec IN (SELECT ANO, ID_PERIODO_ANUAL\n                FROM PERIODO_ANUAL\n                WHERE ID_PERIODO_ANUAL IN (SELECT PERIODO_ANUAL\n                                           FROM TABLE(OBTENER_PERIODO_ANUAL_DISTRIBUCION_X_PERIODO_ANUAL(periodoAnual)))\n                ORDER BY ANO)\n    LOOP\n        -- Utilizar el constructor del tipo ANO_TYPE\n        v_ano := ANO_TYPE(rec.ANO);\n\n        -- Utilizar el constructor del tipo ANO_TYPE\n        v_periodo := PERIODO_ANUAL_TYPE(rec.ID_PERIODO_ANUAL);\n\n       -- A\u00f1adir los resultados al arreglo de a\u00f1os\n        v_periodos.EXTEND;\n        v_periodos(v_periodos.LAST) := v_periodo;\n\n        -- A\u00f1adir los resultados al arreglo de a\u00f1os\n        v_anos.EXTEND;\n        v_anos(v_anos.LAST) := v_ano;\n\n    END LOOP;\n\n\n    v_sql := 'SELECT * FROM ( ';\n    v_sql := v_sql || 'SELECT ';\n    v_sql := v_sql || 'DISTINCT ';\n    v_sql := v_sql || 'APD.APORTE_ESTRATEGICO                                          APORTE_ESTRATEGICO, ';\n    v_sql := v_sql || 'APD.PERIODO_ANUAL                                               PERIODO_ANUAL, ';\n    v_sql := v_sql || 'APD.DISTRIBUCION_PORCENTUAL*(1 \/ CAN_APO.CANTIDAD_APORTES)      PROGRAMACION, ';\n    v_sql := v_sql || 'CAN_APO.CANTIDAD_APORTES                                        CANTIDAD_APORTES_X_ACCION, ';\n    v_sql := v_sql || '(1 \/ CAN_APO.CANTIDAD_APORTES)                                  REPRESENTATIVIDAD';\n    v_sql := v_sql || ' FROM ';\n    v_sql := v_sql || 'META_POA_APORTE                         MPAP ';\n    v_sql := v_sql || 'INNER JOIN (SELECT * FROM TABLE(PPI.OBTENER_METAS_OPE_FUNCIONALES_X_PERIODO_ANUAL(' || periodoAnual || '))) METAS_FUNCIONALES on MPAP.META_POA = METAS_FUNCIONALES.META_POA ';\n    v_sql := v_sql || 'INNER JOIN APORTE_ESTRATEGICO APE ON (APE.ID_APORTE_ESTRATEGICO = MPAP.APORTE_ESTRATEGICO) ';\n    v_sql := v_sql || 'INNER JOIN APORTE_PAE_DISTRIBUCION APD ON (APD.APORTE_ESTRATEGICO = APE.ID_APORTE_ESTRATEGICO) ';\n    v_sql := v_sql || 'INNER JOIN ACCION_ESTRATEGICA ACE ON (ACE.ID_ACCION_ESTRATEGICA = APE.ACCION_ESTRATEGICA) ';\n    v_sql := v_sql || '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 ';\n    v_sql := v_sql || 'WHERE ';\n    v_sql := v_sql || 'APD.PERIODO_ANUAL IN (SELECT * FROM TABLE(PPI.OBTENER_PERIODO_ANUAL_DISTRIBUCION_X_PERIODO_ANUAL(' || periodoAnual || '))) ';\n    v_sql := v_sql || ') ';\n    v_sql := v_sql || 'PIVOT ( ';\n    v_sql := v_sql || 'MAX(PROGRAMACION) FOR PERIODO_ANUAL IN ( ';\n\n\n    -- CONSTRUIR PIVOTEO\n    FOR i IN 1..v_anos.LAST LOOP\n\n        v_sql := v_sql || v_periodos(i).PERIODO_ANUAL || ' as \"' || v_anos(i).ANO || '\"';\n\n        IF i &lt; v_anos.LAST THEN\n            v_sql := v_sql || ', ';\n        END IF;\n    END LOOP;\n\n    v_sql := v_sql || ') ';\n    v_sql := v_sql || ') ';\n    v_sql := v_sql || 'ORDER BY APORTE_ESTRATEGICO';\n    DBMS_OUTPUT.PUT_LINE('DEBUG: v_sql: ' || v_sql);\n\n\n   \n    RETURN v_sql;\n\nEND OBTENER_PROGRAMACION_X_PERIODO_ANUAL_CONSULTA;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">DBMS_OUTPUT.PUT_LINE<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Esta linea <\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>DBMS_OUTPUT.PUT_LINE('DEBUG: v_sql: ' || v_sql);<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Nos permite consultar el resultado de la consulta para saber si esta bien<\/li>\n\n\n\n<li>para probarla dentro de la funci\u00f3n le damos ejecutar y nos muestra el resultado<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"606\" src=\"https:\/\/sada.services\/wp-content\/uploads\/2023\/11\/Seleccion_898-1024x606.png\" alt=\"\" class=\"wp-image-16077\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2023\/11\/Seleccion_898-1024x606.png 1024w, https:\/\/sada.services\/wp-content\/uploads\/2023\/11\/Seleccion_898-300x178.png 300w, https:\/\/sada.services\/wp-content\/uploads\/2023\/11\/Seleccion_898-768x454.png 768w, https:\/\/sada.services\/wp-content\/uploads\/2023\/11\/Seleccion_898.png 1166w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"684\" height=\"572\" src=\"https:\/\/sada.services\/wp-content\/uploads\/2023\/11\/Seleccion_899.png\" alt=\"\" class=\"wp-image-16078\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2023\/11\/Seleccion_899.png 684w, https:\/\/sada.services\/wp-content\/uploads\/2023\/11\/Seleccion_899-300x251.png 300w\" sizes=\"(max-width: 684px) 100vw, 684px\" \/><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>FUNCION OBTENER_METAS_OPE_FUNCIONALES_X_PERIODO_ANUAL FUNCION OBTENER_PERIODOS_ANUALES_DISTRIBUCION_X_PERIODO_ANUAL ADICIONAL: crear una funci\u00f3n que devuelva la consulta OTRA PARA RETORNAR SELECT RESPALDO FUNCION OBTENER_APD_X_PERIODDO_ANUAL Funcion de programacion DBMS_OUTPUT.PUT_LINE<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[519],"tags":[591,593],"class_list":["post-16055","post","type-post","status-publish","format-standard","hentry","category-oracle","tag-funcion","tag-tabla"],"blocksy_meta":[],"_links":{"self":[{"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/posts\/16055","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/sada.services\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=16055"}],"version-history":[{"count":32,"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/posts\/16055\/revisions"}],"predecessor-version":[{"id":16119,"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/posts\/16055\/revisions\/16119"}],"wp:attachment":[{"href":"https:\/\/sada.services\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=16055"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sada.services\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=16055"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sada.services\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=16055"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}