Hola felipelvrd, Te dejo un ejemlo de como debe quedar tu listar el mismo se realizad usando tipos, colecciones y cursores al final devuelve una colección. Tal vez te de una idea.
Código SQL:
Ver originalPROCEDURE P_Listar(
pv_num_empresa IN sgm00tm_det_empresas_usuario.num_empresa%TYPE,
pv_cod_tipo_presupuesto IN varchar2,
pv_des_tipo_presupuesto IN sgm00tt_sacp_tip_presupuesto_v.des_tipo_presupuesto%TYPE,
pv_num_pagina IN NUMBER,
pv_reg_presentar IN NUMBER,
pv_accion IN NUMBER,
po_mensaje OUT varchar2,
po_arreglo OUT DM_T_PRESUPUESTO,
po_total_registros OUT NUMBER)
IS
v_tabla DM_T_PRESUPUESTO := DM_T_PRESUPUESTO(); --esto es una coleccion en oracle la cual debe estar previamente deficina con los campos a mostrar
v_registro DM_PRESUPUESTO := DM_PRESUPUESTO(NULL,NULL);
v_Linea BINARY_INTEGER := 0;
TYPE CUR_TYP IS REF CURSOR;
cur_registros CUR_TYP;
v_query VARCHAR2(24000);
v_query :=
'SELECT * FROM ( SELECT a.*, rownum rnum FROM (
select to_char(cod_tipo_presupuesto) as cod_tipo_presupuesto, des_tipo_presupuesto
from sgm00tt_sacp_tip_presupuesto_v
where nvl(:pv_cod_tipo_presupuesto, cod_tipo_presupuesto) = cod_tipo_presupuesto
and upper(nvl(des_tipo_presupuesto, ''|-*-|'')) like ''%''||upper(nvl(:pv_des_tipo_presupuesto, nvl(des_tipo_presupuesto, ''|-*-|'')))||''%''
) a WHERE rownum <= :Final ) WHERE rnum >= :Inicio';
OPEN cur_registros FOR v_query USING
pv_cod_tipo_presupuesto, pv_des_tipo_presupuesto,
100000, 1;
LOOP
FETCH cur_registros INTO
v_registro.cod_tipo_presupuesto,
v_registro.des_tipo_presupuesto,
v_lineas;
IF (cur_registros%FOUND) THEN
v_linea := v_linea + 1;
v_tabla.EXTEND;
v_tabla(v_linea) := v_registro;
ELSE
EXIT;
END IF;
CLOSE cur_registros;
po_arreglo := v_tabla;
EXCEPTION
WHEN OTHERS THEN
po_mensaje := nvl(f_mensaje_error(pv_num_empresa,substr(sqlcode,2,10)),'Ocurrió un Error a la hora de Consultar: '||sqlerrm);
END P_Listar;