Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

Retornar tabla PL/SQL

Estas en el tema de Retornar tabla PL/SQL en el foro de Oracle en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 12/05/2011, 15:54
 
Fecha de Ingreso: mayo-2011
Mensajes: 1
Antigüedad: 13 años, 6 meses
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;
  #2 (permalink)  
Antiguo 12/05/2011, 17:01
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 17 años
Puntos: 85
Respuesta: Retornar tabla PL/SQL

No he mirado en detalle la lógica del package, pero te puedo decir que en los casos donde quieras almacenar datos en un type y enviarlos fuera del ámbito de un procedimiento o función, no es suficiente con declarar en PL/SQL la definición del type, tienes que crearlos de antemano, por ejemplo:

Código:
SQL> create or replace TYPE tipoRecTabla as object
  2  (
  3  RAMO VARCHAR2(10),
  4  AREA VARCHAR2(20),
  5  TOTAL INTEGER,
  6  ENTIEMPO INTEGER,
  7  ATRASADA INTEGER,
  8  PORCENTAJEENTIEMPO VARCHAR2(10),
  9  PORCENTAJEATRASADA VARCHAR2(10)
 10  )
 11  /

Tipo creado.

SQL> create or replace TYPE TablaEnTiempoAtraso IS TABLE OF tipoRecTabla
  2  /

Tipo creado.

SQL> create or replace function f1
  2  return TablaEnTiempoAtraso
  3  is
  4  un_tipo TablaEnTiempoAtraso := TablaEnTiempoAtraso();
  5  begin
  6  return un_tipo;
  7  end;
  8  /

Función creada.

SQL> select f1 from dual;

F1(RAMO, AREA, TOTAL, ENTIEMPO, ATRASADA, PORCENTAJEENTIEMPO, PORCENTAJEATRASADA)
---------------------------------------------------------------------------------
TABLAENTIEMPOATRASO()

SQL>
Saludos

Etiquetas: tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:05.