Você pode implementar isso usando um cursor de referência de tipo fraco como o tipo de retorno. Isso é especialmente fácil de implementar a partir de uma interface de cliente usando JDBC, pois o tipo de cursor retornado pode ser percorrido como qualquer resultado de consulta e os metadados podem ser interrogados de ResultSet.getMetaData(). Aqui está um exemplo:
CREATE OR REPLACE PROCEDURE retrieve_info(field_id in integer, p_cursor in out sys_refcursor)
AS
BEGIN
open p_cursor for 'select * from emp';
END;
A consulta entre aspas pode ser qualquer coisa que retorne qualquer tipo, para qualquer número de colunas.