Как ссылаться на параметр оракула pl / sql out таблицы% rowtype как объект в Java - PullRequest
2 голосов
/ 13 декабря 2011

В Oracle 11g у меня есть таблица survey со свойствами id, title и message. Хранимая процедура ниже получает одну запись на основе предоставленного идентификатора и сохраняет ее в предоставленном параметре OUT.

create or replace procedure get_survey(arg_id number, obj_survey out survey%rowtype) is
begin
  select * into obj_survey from survey where id = arg_id;
end get_survey;

Мне нужно вызвать эту хранимую процедуру из Java, и я знаю, что могу начать с CallableStatement, но как мне передать параметр OUT из Java, учитывая, что он должен иметь тип survey%rowtype? Я знаю, что вместо этого могу использовать курсор, но думаю, что это не очень хорошая практика, поскольку я получаю только одну строку. Также мне нужно создать объект Survey (POJO) из параметра OUT и вернуть его из метода. Вот как далеко я сейчас попал в коде:

public Survey getSurvey(int id) throws SQLException {
  CallableStatement stmt = conn.prepareCall("begin get_survey(?, ?); end;");
  stmt.setInt(1, id);
  stmt.registerOutParameter(2, OracleTypes.[okay what do i put here?]); // not sure about this line either
  stmt.execute();

  // get the out parameter, convert it to a Survey object type and return it

}

Ответы [ 4 ]

1 голос
/ 13 декабря 2011

"rowtype" здесь является типом, специфичным для Oracle PL / SQL, я не думаю, что он будет поддерживаться JDBC.Быстрый поиск форумов оракула (google "jdbc rowtype site: oracle.com") предлагает то же самое.Возможно, вам лучше вернуть курсор или просто выполнить SQL непосредственно из JDBC.

0 голосов
/ 13 ноября 2016

К сожалению, вы не можете сериализовать тип PL / SQL RECORD через JDBC, но вы можете обойти это ограничение, выполнив анонимный блок PL / SQL, например:

DECLARE
  obj_survey survey%rowtype;
BEGIN
  get_survey(?, obj_survey);

  ? := obj_survey.id;
  ? := obj_survey.x;
  ? := obj_survey.y;
  ...
  -- continue this for all attributes in survey
END;

Теперь вы можете использовать следующее CallableStatement:

try (CallableStatement s = conn.createCall(" [ ... above PL/SQL ... ] ")) {
    s.setInt(1, id);
    s.registerOutParameter(2, Types.INTEGER);
    s.registerOutParameter(3, Types.VARCHAR);
    s.registerOutParameter(4, Types.DATE);
    ...
    // Repeat for all attributes

    s.execute();

    int id = s.getInt(2);
    String x = s.getString(3);
    Date y = s.getDate(4);
    ...
    // Repeat for all attributes
}

Недавно я написал об этой технике в сообщении в блоге , в котором также объясняется, как эти блоки PL / SQL могут генерироваться автоматически для всех типов записей PL / SQL.

0 голосов
/ 14 декабря 2011
cstmt = conn.getNewCallableStatement("{call MY_PLSQL_PACKAGE.MY_PROC(?,?,?)}");
       cstmt.setString(1, stringOutput1);
       cstmt.setString(2, stringOutput2);
       cstmt.registerOutParameter(3, OracleTypes.CURSOR);
       cstmt.execute;
0 голосов
/ 13 декабря 2011

Просто идея. Вы можете сделать свою функцию в виде функции с контурами, а затем извлечь данные, как если бы это была таблица.Вот несколько примеров функций с контурами

http://www.akadia.com/services/ora_pipe_functions.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...