Puedes usar REFCURSORs. Por ejemplo en SQL*Plus creo la siguiente funcion:
create or replace function get_tabla return sys_refcursor is
ref sys_refcursor;
begin
open ref for
select last_name
from employees;
return ref;
end;
/
Function created.
Puedes usar esta funcion desde .NET, Java y otros. Todos soportan los REFCURSORs (variables de tipo cursor). Para ver todos los registros desde SQL*Plus ejecutas lo siguiente:
SQL> variable v REFCURSOR;
SQL> execute :v := get_tabla;
PL/SQL procedure successfully completed.
SQL> print v
LAST_NAME
Abel
Davies
De Haan
Ernst
Fay
Gietz
Grant
Hartstein
Higgins
Hunold
King
…
El sql usado en la funcion puede ser una cadena. Es decir, lo puede hacer dinamica. Tambien puedes usarlo en un procedure con varias argumentos de tipo output del tipo REFCURSORs. Es decir, en una sola ejecucion puedes recuperar diferentes conjuntos de datos (cada uno asociado a un SELECT distinto)
Por otro lado, las variables REFCURSORs son punteros a memoria (apuntan al SQL Area donde Oracle mantiene los resultados de la consulta)
Si trabajas con ODP.NET chequea la siguiente dirección:
http://www.oracle.com/technology/pub/ar … rsors.html