Хранимая процедура, возвращающая несколько таблиц в шаблон spring jdbc

Я вызываю хранимую процедуру из своего класса Spring DAO, используя JdbcTemplate. Моя проблема в том, что хранимая процедура возвращает несколько таблиц. Есть ли способ получить доступ к нескольким таблицам с помощью Spring JdbcTemplate.

Если я использую jdbcTemplate.queryForList(myStoredProc, new Object[]{parameters}, я получаю только первую таблицу из результата.

Моя база данных SQL Server 2005.

Есть ли какой-либо другой метод, кроме jdbcTemplate, для моего требования. Если да, пожалуйста, дайте мне знать.

Заранее спасибо...


person Krishna    schedule 18.05.2011    source источник


Ответы (2)


См. http://static.springsource.org/spring/docs/2.0.7/reference/jdbc.html#jdbc-StoredProcedure

Пример, приведенный в этом разделе, как раз для вашего случая, когда хранимая процедура возвращает несколько наборов результатов. Хотя приведенный здесь пример предназначен для Oracle, он должен работать таким же образом и для MS SQL Server.

person sinha    schedule 18.05.2011
comment
Я использую Spring StoredProc с proc, который возвращает скалярный результат или результат только одной строки, но мне было любопытно, как справиться с таким случаем. Знаете ли вы, каким будет содержимое возвращаемой карты в случае, если процедура возвращает несколько строк? Это карта карт, где прилагаемые ключи карты являются индексом строки? - person Guillaume; 16.05.2012

Решение, на которое ссылается Синха, не сработало для меня. Я смог решить это, используя JdbcTemplate#call(CallableStatementCreator, List<SqlParameter>). Например:

private static final String sql = "{call schema_name.the_stored_procedure(?, ?, ?)}";

// The input parameters of the stored procedure
private static final List<SqlParameter> declaredParams = Arrays.asList(
    new SqlParameter("nameOfFirstInputParam", Types.VARCHAR),
    new SqlParameter("nameOfSecondInputParam", Types.VARCHAR),
    new SqlParameter("nameOfThirdInputParam", Types.VARCHAR));

private static final CallableStatementCreatorFactory cscFactory
    = new CallableStatementCreatorFactory(sql, declaredParams);

// The result sets of the stored procedure
private static final List<SqlParameter> returnedParams = Arrays.<SqlParameter>asList(
    new SqlReturnResultSet("nameOfFirstResultSet", SomeRowMapper.INSTANCE),
    new SqlReturnResultSet("nameOfSecondResultSet", SomeOtherRowMapper.INSTANCE));

public static Map<String, Object> call(JdbcTemplate jdbcTemplate,
                                       String param0,
                                       String param1,
                                       String param2) {
  final Map<String, Object> actualParams = new HashMap<>();
  actualParams.put("nameOfFirstInputParam", param0);
  actualParams.put("nameOfSecondInputParam", param1);
  actualParams.put("nameOfThirdInputParam", param2);

  CallableStatementCreator csc = cscFactory.newCallableStatementCreator(actualParams);
  Map<String, Object> results = jdbcTemplate.call(csc, returnedParams);

  // The returned map will including a mapping for each result set.
  //
  // {
  //   "nameOfFirstResultSet" -> List<SomeObject>
  //   "nameOfSecondResultSet" -> List<SomeOtherObject>
  // }
  //
  // For this example, we just return the heterogeneous map.  In practice,
  // it's better to return an object with more type information.  In other
  // words, don't make client code cast the result set lists.  Encapsulate
  // that casting within this method.

  return results;
}
person Bobby Eickhoff    schedule 10.04.2013
comment
Спасибо! SqlReturnResultSet это то, что я искал. :) - person Lyubomyr Shaydariv; 03.09.2015
comment
Использование нескольких выборок в одном запросе. Это запрос, который мне был нужен. Спасибо - person Vigneswaran Rk; 16.11.2018