Ver Mensaje Individual
  #1 (permalink)  
Antiguo 12/05/2011, 15:54
angelous_1
 
Fecha de Ingreso: mayo-2011
Mensajes: 1
Antigüedad: 13 años
Puntos: 0
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;