我在谷歌上搜索过StackOverflow,我阅读过示例和教程,我浏览过Spring JavaDocs和其他文档。我尝试了很多不同的排列。
无论我尝试什么,我都会得到相同或类似的错误,只改变它抱怨不提供的参数:
org.springframework.jdbc.UncategorizedSQLException: CallableStatementCallback;
uncategorized SQLException for SQL [{? = call sys.sp_sequence_get_range(?)}];
SQL state [S0004]; error code [201];
Procedure or function 'sp_sequence_get_range' expects parameter '@range_size',
which was not supplied.; nested exception is
com.microsoft.sqlserver.jdbc.SQLServerException: Procedure or function
'sp_sequence_get_range' expects parameter '@range_size', which was not supplied.
Java代码:
SimpleJdbcCall jdbcCall = new SimpleJdbcCall(dataSource())
.withProcedureName("sp_sequence_get_range")
.withoutProcedureColumnMetaDataAccess()
.withCatalogName("sys")
.declareParameters(new SqlParameter("sequence_name", Types.NVARCHAR), new SqlParameter("range_size", Types.BIGINT))
.withReturnValue();
MapSqlParameterSource params = new MapSqlParameterSource()
.addValue("sequence_name", "dbo.M_PRODUCT_PROD_ID_SEQ")
.addValue("range_size", Integer.valueOf(rangeSize_));
Map<String, Object> retVals = jdbcCall.execute(params);
存储过程SQLServer 2012(v 11)sys.sp_sequence_get_range():
https://msdn.microsoft.com/en-us/library/ff878352(v=sql.110)。aspx?f=255
我定义了一个标准序列——我不认为这有什么关系,因为我甚至不能从我的代码中到达SP。从服务器工作室SQLSP工作时,我这样调用它:
EXEC sys.sp_sequence_get_range
@sequence_name = N'dbo.M_PRODUCT_PROD_ID_SEQ'
, @range_size = 500
, @range_first_value = @FirstSeqNum OUTPUT
, @range_last_value = @LastSeqNum OUTPUT ;
-- The following statement returns the output values
SELECT
@FirstSeqNum AS FirstVal
, @LastSeqNum AS LastVal;
我写了一个单元测试,其中rangeSize_u==100;
参数类型与MS在其文档中定义的类型匹配。
除非我是盲人,否则参数名称匹配,并且它们的顺序与SP预期的相同。
我使用的是“WithOutProcedureRecolumnMetadataAccess()”,这是解决这个问题的常用建议方法,但没有效果。
它似乎通过了第一个参数,但拒绝了第二个参数?
如果我更改params源以包括类型:
MapSqlParameterSource params = new MapSqlParameterSource()
.addValue("sequence_name", "dbo.M_PRODUCT_PROD_ID_SEQ", Types.NVARCHAR)
.addValue("range_size", BigInteger.valueOf(rangeSize_), Types.BIGINT);
我得到一个不同的错误:
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: The value is not set for the parameter number 1.
这是否意味着我更进一步,只需要注册一个OUT参数?
建议?
提前感谢。
我知道现在回答这个问题已经很晚了,但是SP可以被称为:
public Long getStartingSequenceNumber(String sequenceName, Long incrementBy) throws SQLException {
Connection con = dataSource.getConnection();
CallableStatement cstmt = null;
try {
cstmt = con.prepareCall(
"{call sys.sp_sequence_get_range(?, ?, ?)}");
cstmt.setString("sequence_name", sequenceName);
cstmt.setLong("range_size",incrementBy);
cstmt.registerOutParameter("range_first_value", microsoft.sql.Types.SQL_VARIANT);
cstmt.execute();
return cstmt.getLong("range_first_value");
}finally {
if (cstmt != null) {
cstmt.close();
}
}
}
我并没有完全达到我想要的解决方案;我把这个交给了另一个想出解决方案的开发人员。他没有直接调用系统SP,而是在它周围写了一个存储的proc包装器,只需要一个参数并返回6个值。我们终于开始工作了。它不漂亮,但它起作用了,大大减少了我们生成序列值的时间。
从他所做的工作来看,我认为答案应该是注册所有的参数。有一天我会抽出时间去做,也许会发布一个更好的答案,但是现在我正试图结束这个已经超过截止日期的项目。
本文向大家介绍请简单介绍一下spring?相关面试题,主要包含被问及请简单介绍一下spring?时的应答技巧和注意事项,需要的朋友参考一下 考察点:spring 参考回答: Spring是一个轻量级框架,可以一站式构建你的企业级应用。 Spring的模块大概分为6个。分别是: 1、Core Container(Spring的核心)【重要】 2、AOP(面向切面变成)【重要】 3、Messaging
本文向大家介绍Spring Boot 中的Servlet简单使用,包括了Spring Boot 中的Servlet简单使用的使用技巧和注意事项,需要的朋友参考一下 当使用spring-Boot时,嵌入式Servlet容器通过扫描注解的方式注册Servlet、Filter和Servlet规范的所有监听器(如HttpSessionListener监听器)。 Spring boot 的主 Servlet
我是spring Boot的初学者,我尝试使用thymeleaf表单进行简单登录,它接受输入的名称和密码,并将其与存储在id为1的数据库中的用户的名称和密码进行比较。我的控制器是: 我的html表单如下: 有什么问题吗 控制器无法重新识别对象th: ject="${user}",因此我将此方法更改为: 对此: 现在一切顺利
令牌名称:mytoken Auth URL:localhost:8080/admin/oauth 访问令牌URL:localhost:8080/admin/oauth/Token
变量命名 在《初识永远强大的函数》一文中,有一节专门讨论“取名字的学问”,就是有关变量名称的问题,本着温故而知新的原则,这里要复习: 名称格式:(下划线或者字母)+(任意数目的字母,数字或下划线) 注意: 区分大小写 禁止使用保留字 遵循通常习惯 以单一下划线开头的变量名(_X)不会被from module import *语句导入的。 前后有下划线的变量名(X)是系统定义的变量名,对解释器有特殊
本文向大家介绍java Spring AOP详解及简单实例,包括了java Spring AOP详解及简单实例的使用技巧和注意事项,需要的朋友参考一下 一、什么是AOP AOP(Aspect Oriented Programming)面向切面编程不同于OOP(Object Oriented Programming)面向对象编程,AOP是将程序的运行看成一个流程切面,其中可以在切面中的点嵌入程序