Obtener el tipo de tabla Oracle del procedimiento almacenado utilizando JDBC

Estoy tratando de entender diferentes formas de obtener datos de la tabla de procedimientos / funciones almacenados de Oracle utilizando JDBC. Las seis formas son las siguientes:

procedure devolviendo un tipo de tabla de nivel de esquema como un parámetro OUTprocedure devolviendo un tipo de tabla a nivel de paquete como un parámetro OUTprocedure que devuelve un tipo de cursor a nivel de paquete como un parámetro OUTfunction devolviendo una tabla de nivel de esquema tipofunction devolviendo una tabla de nivel de paquete tipofunction devolviendo un tipo de cursor a nivel de paquete

Aquí hay algunos ejemplos en PL / SQL:

-- schema-level table type
CREATE TYPE t_type AS OBJECT (val VARCHAR(4));
CREATE TYPE t_table AS TABLE OF t_type;

CREATE OR REPLACE PACKAGE t_package AS
  -- package level table type
  TYPE t_table IS TABLE OF some_table%rowtype;
  -- package level cursor type
  TYPE t_cursor IS REF CURSOR;
END library_types;

-- and example procedures:
CREATE PROCEDURE p_1 (result OUT t_table);
CREATE PROCEDURE p_2 (result OUT t_package.t_table);
CREATE PROCEDURE p_3 (result OUT t_package.t_cursor);
CREATE FUNCTION f_4 RETURN t_table;
CREATE FUNCTION f_5 RETURN t_package.t_table;
CREATE FUNCTION f_6 RETURN t_package.t_cursor;

He logrado llamar a 3, 4 y 6 con JDBC:

// Not OK: p_1 and p_2
CallableStatement call = connection.prepareCall("{ call p_1(?) }");
call.registerOutParameter(1, OracleTypes.CURSOR);
call.execute(); // Raises PLS-00306. Obviously CURSOR is the wrong type

// OK: p_3
CallableStatement call = connection.prepareCall("{ call p_3(?) }");
call.registerOutParameter(1, OracleTypes.CURSOR);
call.execute();
ResultSet rs = (ResultSet) call.getObject(1); // Cursor results

// OK: f_4
PreparedStatement stmt = connection.prepareStatement("select * from table(f_4)");
ResultSet rs = stmt.executeQuery();

// Not OK: f_5
PreparedStatement stmt = connection.prepareStatement("select * from table(f_5)");
stmt.executeQuery(); // Raises ORA-00902: Invalid data type

// OK: f_6
CallableStatement call = connection.prepareCall("{ ? = call f_6 }");
call.registerOutParameter(1, OracleTypes.CURSOR);
call.execute();
ResultSet rs = (ResultSet) call.getObject(1); // Cursor results

Así que obviamente tengo problemas para entender

Cómo recuperar tipos de tabla a nivel de esquema y paquete a partir de parámetros OUT en procedimientos almacenados Cómo recuperar tipos de tabla a nivel de paquete de funciones almacenadas

Parece que no puedo encontrar ninguna documentación sobre esto, ya que todos siempre usan cursores en lugar de tipos de tabla. Tal vez porque no es posible? Sin embargo, prefiero los tipos de tabla porque están formalmente definidos y se pueden descubrir utilizando las vistas de diccionario (al menos los tipos de tabla de nivel de esquema).

Nota: obviamente, podría escribir una función de contenedor que devuelva los parámetros OUT y los tipos de tabla a nivel de paquete. Pero prefiero la solución limpia.

Respuestas a la pregunta(2)

Su respuesta a la pregunta