Благодарю. Дело не в этом. Да, вы можете материализовать (ref) курсор, который возвращается из хранимой процедуры. Вопрос заключался в том, какие типы PL / SQL «курсора» вообще могут быть материализованы, а именно: могут ли материализоваться типы коллекций PL / SQL?

аюсь понять различные способы получения табличных данных из хранимых процедур / функций Oracle с использованием JDBC. Шесть способов следующие:

процедура, возвращающая тип таблицы уровня схемы в качестве параметра OUTпроцедура, возвращающая тип таблицы уровня пакета в качестве параметра OUTпроцедура, возвращающая тип курсора уровня пакета в качестве параметра OUTфункция, возвращающая тип таблицы уровня схемыфункция, возвращающая тип таблицы уровня пакетафункция, возвращающая тип курсора уровня пакета

Вот несколько примеров в 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;

Мне удалось позвонить 3, 4 и 6 с 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

Очевидно, у меня проблемы с пониманием

Как извлечь типы таблиц уровня схемы и уровня пакета из параметров OUT в хранимых процедурахКак извлечь типы таблиц уровня пакета из хранимых функций

Я не могу найти какую-либо документацию по этому вопросу, поскольку все всегда используют курсоры вместо типов таблиц. Может потому что это невозможно? Я предпочитаю табличные типы, потому что они формально определены и могут быть обнаружены с использованием словарных представлений (по крайней мере, табличных типов на уровне схемы).

Примечание: очевидно, я мог бы написать функцию-обертку, возвращающую параметры OUT и типы таблиц уровня пакета. Но я бы предпочел чистое решение.

Ответы на вопрос(2)

Ваш ответ на вопрос