我在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方式。
您应该使用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,我