Как отобразить объект Oracle в JDBC - PullRequest
3 голосов
/ 06 августа 2010

У меня есть такой объект оракула:

CREATE OR REPLACE type employee_obj
    AS
      object (
        id NUMBER(10) ,
        ...
      )

хранимая процедура

function get_employee_obj () return employee_obj is
      l_employee       employee_obj;
    begin
        ...
      return l_employee;
    end;

и мне нужно позвонить из кода Java:

    final String QUERY = "begin ? := GET_EMPLOYEE_OBJ(); end;";
    Connection connection = getConnection();

    CallableStatement stmt = connection.prepareCall(QUERY);
    stmt.registerOutParameter(1, <WHAT TO PUT HERE>);

    stmt.execute();
    ResultSet rs = (ResultSet) stmt.getObject(1);    
    ...

Какой тип sql или oracle мне нужно указать в качестве параметра для registerOutParameter для чтения объекта из хранимой функции? Я пробовал несколько, но всегда получал PLS-00382: выражение имеет неверный тип ошибки. Спасибо!

1 Ответ

3 голосов
/ 08 сентября 2014

Правильный тип для объекта Oracle - java.sql.Types.STRUCT или oracle.jdbc.OracleTypes.STRUCT в зависимости от уровня поддержки, который вам необходим.

Но хитрость, чтобы избавиться от ошибки PLS-00382: expression is of wrong type, состоит в том, чтобы указать имя типа схемы. Оно должно быть написано во всех верхних регистрах , иначе вы получите invalid name pattern исключение.

Учитывая ваш пример, может подойти что-то подобное:

stmt.registerOutParameter(1, OracleTypes.STRUCT, "EMPLOYEE_OBJ");

или

stmt.registerOutParameter(1, Types.STRUCT, "EMPLOYEE_OBJ");

После запроса execute вы получите доступ к результату:

STRUCT result = (oracle.sql.STRUCT)stmt.getObject(1);
Object[] attr = result.getAttributes();
// attr[0] if the first field
// attr[1] the second
// and so on
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...