gpt4 book ai didi

java - Spring SimpleJdbcCall 和 SQL Server 系统存储过程 - 期望未提供参数,但它是?

转载 作者:行者123 更新时间:2023-12-04 18:04:58 29 4
gpt4 key购买 nike

我用谷歌搜索,搜索 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);

存储过程是 SQL Server 2012 (v 11) sys.sp_sequence_get_range():

https://msdn.microsoft.com/en-us/library/ff878352%28v=sql.110%29.aspx?f=255&MSPPError=-2147217396

我定义了一个标准序列 - 我认为这并不重要,因为我什至无法从我的代码中获取 SP。在 SQL Server Studio 中,当我这样调用它时,SP 会工作:

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_ == 100;

参数类型与 MS 在其文档中定义的类型相匹配。

除非我是盲人,否则参数名称匹配并且它们的顺序与 SP 期望的顺序相同。

我正在使用“withoutProcedureColumnMetaDataAccess()”,这是针对此问题的通常建议补救措施 - 无济于事。

它似乎通过了第一个参数,但拒绝了第二个?

如果我更改参数源以包含类型:

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,而是围绕它编写了一个存储过程包装器,它只接受一个参数并返回 6 个值。我们终于开始工作了。它并不漂亮,但它有效并且大大减少了我们生成序列值所花费的时间。

根据他所做的工作,我认为答案也是注册所有输出参数。总有一天我会着手做这件事,也许会发布一个更好的答案,但现在我正试图结束这个超过截止日期的项目。

关于java - Spring SimpleJdbcCall 和 SQL Server 系统存储过程 - 期望未提供参数,但它是?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28620207/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com