Получение типа таблицы Oracle из хранимой процедуры с помощью JDBC

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

  1. процедура, возвращающая тип таблицы уровня схемы в качестве параметра OUT
  2. процедура, возвращающая тип таблицы уровня пакета в качестве параметра OUT
  3. процедура, возвращающая тип курсора уровня пакета как параметр OUT
  4. функция, возвращающая тип таблицы уровня схемы
  5. функция, возвращающая тип таблицы уровня пакета
  6. функция, возвращающая тип курсора уровня пакета

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

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

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

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

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

17
задан Lukas Eder 20 June 2011 в 12:27
поделиться