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

Spring简单JdbcCall

康恩
2023-03-14

我在谷歌上搜索过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参数?

建议?

提前感谢。

共有2个答案

西门鹏程
2023-03-14

我知道现在回答这个问题已经很晚了,但是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();
  }
}

}

慕容康安
2023-03-14

我并没有完全达到我想要的解决方案;我把这个交给了另一个想出解决方案的开发人员。他没有直接调用系统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是将程序的运行看成一个流程切面,其中可以在切面中的点嵌入程序