有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Spring SimpleJDBCall&SQL Server系统存储过程要求未提供参数,但它是?

我在谷歌上搜索过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_u==100

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

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

我使用的是“WithOutProcedureRecolumnMetadataAccess()”,这是解决这个问题的常用建议方法,但没有效果

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

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

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参数

建议

提前谢谢


共 (1) 个答案

  1. # 1 楼答案

    我并没有达到我想要的目标;我把这个交给了另一个想出解决办法的开发人员。他没有直接调用系统SP,而是围绕它编写了一个存储过程包装器,只接受一个参数并返回6个值。我们终于成功了。它并不漂亮,但它可以工作,并大大减少我们生成序列值所需的时间

    根据他所做的工作,我认为答案应该是把所有的参数也登记下来。总有一天我会抽出时间来做这件事,也许会发布一个更好的答案,但现在我正试图结束这个已经过了最后期限的项目