Retornar tabla PL/SQL Lo que quiero es retornar una tabla PL/SQl desde una funcion que esta dentro de un package, no me marcó ningun error al crear el package, pero a la hora de ejecutarlo para que me devuelva la tabla me marca que el tipo de dato es invalido, no se si este ejecutando mal el package o si este mal lo que hice, aqui le dejo el codigo, espero que me puedan ayudar
CREATE OR REPLACE PACKAGE Paquete_EnTiempoAtraso AS
TYPE tipoRecTabla IS RECORD
(
RAMO VARCHAR2(10),
AREA VARCHAR2(20),
TOTAL INTEGER,
ENTIEMPO INTEGER,
ATRASADA INTEGER,
PORCENTAJEENTIEMPO VARCHAR2(10),
PORCENTAJEATRASADA VARCHAR2(10)
);
TYPE TablaEnTiempoAtraso IS TABLE OF tipoRecTabla INDEX BY BINARY_INTEGER;--Tabla
FUNCTION ObtenerTablaEnTiempoAtraso(pfiltro IN VARCHAR2)
RETURN TablaEnTiempoAtraso;
END Paquete_EnTiempoAtraso;
CREATE OR REPLACE PACKAGE BODY Paquete_EnTiempoAtraso
AS
FUNCTION ObtenerTablaEnTiempoAtraso
(
pfiltro IN VARCHAR2
)
RETURN TablaEnTiempoAtraso IS
CURSOR cConsulta
IS
SELECT ramo
,Area
,enTiempo+atrasada AS Total
,enTiempo
,atrasada
,CONCAT(ROUND((enTiempo/(enTiempo+atrasada))*100,2),'%') AS PorcentajeEnTiempo
,CONCAT(ROUND((atrasada/(enTiempo+atrasada))*100,2),'%') AS PorcentajeAtrasada
FROM
(
SELECT
enTiempo.ramo
,enTiempo.Area
,NVL(enTiempo.FoliosEnTiempo,0) AS EnTiempo
,NVL(atrasada.foliosatrasados,0) AS Atrasada
FROM (
SELECT
ramo
,Area
,COUNT(folio) AS FoliosEnTiempo
,estatusnodo
FROM vrepentiempoatraso
WHERE estatusnodo ='EN TIEMPO'
GROUP BY estatusnodo,ramo,Area
) enTiempo
LEFT JOIN (
SELECT
ramo
,Area
,COUNT(folio) AS FoliosAtrasados
,estatusnodo
FROM vrepentiempoatraso
WHERE estatusnodo ='ATRASADA'
GROUP BY estatusnodo,ramo,Area
) atrasada
ON atrasada.ramo = enTiempo.ramo
AND atrasada.Area = enTiempo.Area
UNION
SELECT
atrasada.ramo
,atrasada.Area
,NVL(enTiempo.FoliosEnTiempo,0)
,NVL(atrasada.foliosatrasados,0)
FROM (
SELECT
ramo
,Area
,COUNT(folio) AS FoliosAtrasados
,estatusnodo
FROM vrepentiempoatraso
WHERE estatusnodo ='ATRASADA'
GROUP BY estatusnodo,ramo,Area
) atrasada
LEFT JOIN (
SELECT
ramo
,Area
,COUNT(folio) AS FoliosEnTiempo
,estatusnodo
FROM vrepentiempoatraso
WHERE estatusnodo ='EN TIEMPO'
GROUP BY estatusnodo,ramo,Area
) enTiempo
ON enTiempo.ramo=atrasada.ramo
AND enTiempo.Area=atrasada.Area
);
vTipoRecTabla tipoRecTabla;--variable tipo record
vTablaEnTiempoAtraso TablaEnTiempoAtraso;--variable tipo tabla
rConsulta cConsulta%ROWTYPE;--Variable en dode se almacena cada renglon que se va recorriendo en el cursor
vVariable INTEGER;--Esta variable es solo de prueba
vContador INTEGER;--Contador de rows recorridos
BEGIN
vVariable:=2;
vContador := 1;--Se inicializa el contador
OPEN cConsulta;
LOOP
FETCH cConsulta INTO rConsulta;
EXIT WHEN cConsulta%NOTFOUND;
vTablaEnTiempoAtraso(vContador).ramo := rConsulta.ramo;
vTablaEnTiempoAtraso(vContador).Area := rConsulta.Area;
vTablaEnTiempoAtraso(vContador).Total := rConsulta.Total;
vTablaEnTiempoAtraso(vContador).EnTiempo := rConsulta.EnTiempo;
vTablaEnTiempoAtraso(vContador).Atrasada := rConsulta.Atrasada;
vTablaEnTiempoAtraso(vContador).PorcentajeEnTiempo := rConsulta.PorcentajeEnTiempo;
vTablaEnTiempoAtraso(vContador).PorcentajeAtrasada := rConsulta.PorcentajeAtrasada;
vContador := vContador + 1;--Se incrementa el contador
END LOOP;
CLOSE cConsulta;
--END;
RETURN vTablaEnTiempoAtraso;
END ObtenerTablaEnTiempoAtraso;
END Paquete_EnTiempoAtraso; |