当前位置: 首页 > 知识库问答 >
问题:

SQL Server:如何使用Spring jdbctemplate将数组传递给返回多个结果集的存储过程

包修贤
2023-03-14

我在SQL Server 2008中有一个存储过程,它将数组作为输入参数。根据http://www.sommarskog.se/arrays-in-sql-2008.html,我将使用TVP。但是,MSSQL JDBC驱动程序不支持这一点。因此,我无法使用SimpleJDBCall来执行存储过程,因为我无法传递数组参数。我返回使用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方式。

共有1个答案

蒋星驰
2023-03-14

您应该使用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
    }

}
 类似资料:
  • 问题内容: 我需要一个SP来返回多组结果。第二组结果将基于第一组结果的一列。 所以: 如何用我的SP返回@ myTable1和@ myTable2?这种语法完全正确吗? 抱歉,我仍然是SQL的新手… 编辑: 因此,我在下面的代码的最后一行看到错误:“必须声明标量变量“ @ myTable1”” 如果我突出显示并运行代码直到第二个代码,它就可以正常工作。 EDIT2: 解决了该问题。谢谢你们。 问题

  • 问题内容: 我是存储过程的新手。 假设我有一个IDCategory(int),并将其传递给存储过程。在正常情况下,它会: 找到我所有与IDCategory等于我要告诉您的IDCategory的列表。 因此,它会显示3清单,并创建一个带有列的表: IDListing,IDCategory,价格,卖方,图像。 我怎样才能做到这一点? 问题答案: 要从存储过程填充数据集,您将具有如下代码: 您的连接字符

  • 问题内容: 我在形成文字时可能做错了。假设我有一个简单的存储过程,如下所示: 的定义为: 执行这样的查询: 产生以下结果集: 代替: 我的文字是否有问题,还是应该以其他方式访问该字段?感谢您的任何建议。 问题答案: 指定输入的方式看起来不错,因为使用行和数组构造器语法可以观察到相同的行为: 和: 产生: 如果添加: 在循环内部,输出为: 表明您实际上正在获取一个元组,其中“ message”是您期

  • 问题内容: 我需要将字符串数组作为参数传递给MySQL存储例程。该数组可能很长,其元素数量不是固定的。然后,我想将字符串值放入具有一列的内存表中,以便可以处理数据。我不知道这是否可以在MySQL中完成。也许需要肮脏的解决方法。 例如,我有字符串值: 现在,我想从MySQL 表中获取有关这些水果的数据。伪代码: Microsoft SQL Server允许您使用数据类型并将数组作为XML字符串提交,

  • 这里的进一步问题:promissione.all():在解决和/或拒绝所有承诺后返回一个结果 我正在使用Promissione.all迭代: 我有4种不同的环境。我正在搜索一个设备在所有这4个环境。有些返回404,有些返回200,有些返回属性connected=true,有些返回false。 基本上,我想在connected=true时触发一些函数,但如果connected对于环境为false,我