Fetch Tipo de tabela Oracle do procedimento armazenado usando JDBC

Estou tentando entender maneiras diferentes de obter dados da tabela dos procedimentos / funções armazenados do Oracle usando JDBC. As seis maneiras são as seguintes:

procedure retornando um tipo de tabela no nível de esquema como um parâmetro OUTprocedure retornando um tipo de tabela no nível do pacote como um parâmetro OUTprocedure retornando um tipo de cursor no nível do pacote como um parâmetro OUTunção @ retornando um tipo de tabela no nível de esquemaunção @ retornando um tipo de tabela no nível do pacoteunção @ retornando um tipo de cursor no nível do pacote

Aqui estão alguns exemplos em 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;

Consegui ligar para 3, 4 e 6 com o 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

Então, obviamente, estou tendo problemas para entender

Como recuperar tipos de tabela em nível de esquema e em nível de pacote dos parâmetros OUT em procedimentos armazenadComo recuperar tipos de tabela no nível de pacote de funções armazenadas

Não consigo encontrar nenhuma documentação sobre isso, pois todos sempre usam cursores em vez de tipos de tabela. Talvez porque não é possível? No entanto, prefiro os tipos de tabela, porque eles são definidos formalmente e podem ser descobertos usando as visualizações de dicionário (pelo menos os tipos de tabela no nível do esquema

Nota: obviamente, eu poderia escrever uma função wrapper retornando os parâmetros OUT e os tipos de tabela no nível do pacote. Mas eu prefiro a solução limpa.

questionAnswers(2)

yourAnswerToTheQuestion