【问题标题】:SQL Server: How to use Spring jdbctemplate to pass array to stored procedure which returns multiple resultsetsSQL Server:如何使用 Spring jdbctemplate 将数组传递给返回多个结果集的存储过程
【发布时间】:2014-07-16 02:54:31
【问题描述】:

我在 SQL Server 2008 中有一个存储过程,它将数组作为输入参数。根据http://www.sommarskog.se/arrays-in-sql-2008.html,我将使用TVP。但是,这在 MSSQL JDBC 驱动程序中不受支持。因此我不能使用 SimpleJdbcCall 来执行存储过程,因为我不能传递数组参数。我转身使用 JdbcTemplate 来调用这个过程,如下所示:

StringBuilder sb = new StringBuilder();
sb.append("declare @d object_url_type;");
sb.append("insert into @d values (0, 'http://example.com', '/index.html', '');");
sb.append("insert into @d values (0, 'http://example.com', '/help.html', '');");
sb.append("exec procedure_name @objs=@d, @id=123");
jdbcTemplate.query(sb.toString(), new BeanPropertyRowMapper(ObjectData.class));

我遇到的问题是存储过程返回两个结果集。但似乎我只能使用 jdbcTemplate 检索第一个结果集。如果我可以使用 SimpleJdbcCall 很容易去除两个结果集,但不幸的是我不能使用它。我用谷歌搜索了很多,但找不到任何解决这个问题的方法。有人可以帮我吗?我想我会回去使用原始的 JDBC 方式。

【问题讨论】:

    标签: sql-server spring stored-procedures


    【解决方案1】:

    您应该使用 Spring StoredProcedure 类而不是 jdbcTemplate,然后您可以使用 declareParameter 返回多个结果集:

    package com.example;
    
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Types;
    import java.util.HashMap;
    import java.util.Map;
    
    import javax.sql.DataSource;
    
    import org.springframework.jdbc.core.RowMapper;
    import org.springframework.jdbc.core.SqlParameter;
    import org.springframework.jdbc.core.SqlReturnResultSet;
    import org.springframework.jdbc.object.StoredProcedure;
    
    public class ExampleStoredProcedure extends StoredProcedure {
    
        public class MyOtherRowMapper implements RowMapper<Long> {
    
            @Override
            public Long mapRow(ResultSet rs, int rowNum) throws SQLException {
                return rs.getLong("LONGCOLUMNNAME");
            }
    
        }
    
        public class MyRowMapper implements RowMapper<String> {
    
            @Override
            public String mapRow(ResultSet rs, int rowNum) throws SQLException {
                return rs.getString("STRINGCOLUMNMNAME");
            }
    
        }
    
        private static final String INPUT_PARAM = "@strParam";
        public static final String RESULTSET1 = "ResultSet1";
        public static final String RESULTSET2 = "ResultSet2";
    
        public ExampleStoredProcedure(DataSource dataSource, String storedProcName) {
            super(dataSource, storedProcName);
            this.declareParameters();
            compile();
        }
    
        public Map<String, Object> execute(String param) {
            Map<String, Object> inputs = new HashMap<String, Object>();
    
            inputs.put(INPUT_PARAM, param);
            Map<String, Object> results = super.execute(inputs);
    
            return results;
        }
    
        protected void declareParameters() {
            declareParameter(new SqlParameter(INPUT_PARAM, Types.VARCHAR));
            declareParameter(new SqlReturnResultSet(RESULTSET1, new MyRowMapper()));
            declareParameter(new SqlReturnResultSet(RESULTSET2, new MyOtherRowMapper()));
        }
    
    }
    

    调用存储过程:

    package com.example;
    
    import java.util.List;
    import java.util.Map;
    
    import org.junit.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    
    public class ExampleStoredProcedureTest {
        // assuming you pass the dataSource in via injection, etc, etc.
        @Autowired
        public ExampleStoredProcedure storedProc;
    
        @Test
        public void test() {
            Map<String, Object> results = storedProc.execute("Test Parameter");
    
            // accessing the result sets
            List<?> rs1 = (List<?>) results.get(ExampleStoredProcedure.RESULTSET1);
            List<?> rs2 = (List<?>) results.get(ExampleStoredProcedure.RESULTSET2);
    
            // etc
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2014-08-29
      • 1970-01-01
      • 2018-07-31
      • 1970-01-01
      • 2014-12-07
      • 2015-08-20
      • 1970-01-01
      • 2011-01-09
      • 1970-01-01
      相关资源
      最近更新 更多