首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Simplejdbccall存储过程withNamedBinding true

Simplejdbccall存储过程withNamedBinding true
EN

Stack Overflow用户
提问于 2019-02-01 07:02:22
回答 1查看 913关注 0票数 1

我想用SimpleJdbcCall执行带有动态参数的存储过程。总之,我在server中有6个可选参数,其中我必须能够传递任何参数或零参数。我的SP在MS中执行得很好。但不是由SimpleJdbcCall。我尝试了很多种方式,其中之一就是withNamedBinding。但是它给出了"=“附近的输入语法错误,如下所示。

代码语言:javascript
复制
this.simpleJdbcCall = new SimpleJdbcCall(jdbcTemplateObject)
                    .withNamedBinding()
                    .withSchemaName("dbo")
                    .withProcedureName("EmployeeDetails")
                    .useInParameterNames(
                            paramNameArray)
                    .returningResultSet("detailReportData", BeanPropertyRowMapper.newInstance(Employee.class));
            Map<String,Object> out = this.simpleJdbcCall.execute(sqlSource);

日志:

2019-01-31 18:49调试SimpleJdbcCall:405以下参数用于调用{ dbo.EmployeeDetails(empCode => ?,empName => ?,empLoc => ?)}和{empCode=0,empName='hgkghdkgf',empLoc='kjhjk'} 2019-01-31 18:14:49调试DispatcherServlet:993 -无法完成请求empCode CallableStatementCallback;未分类的SQLException for SQL {call dbo.EmployeeDetails(empCode => ?,empName => ?,empLoc empName?)}};SQL;错误代码102;嵌套异常是com.microsoft.sqlserver.jdbc.SQLServerException:在'=‘附近不正确的语法。

EN

回答 1

Stack Overflow用户

发布于 2020-06-18 13:01:25

我曾经遇到过类似的问题,在堆栈溢出问题上也很少找到解决方案。但在我的例子中,我使用的是,这给了我同样的语法错误。在搜索解决方案时,我遇到了Spring的示例(参见11.5.6节)。声明用于SimpleJdbcCall的参数)。万一链接不可用,请看下面的内容

我们可以选择显式地声明一个、一些或所有参数。参数元数据仍在使用中。通过调用方法withoutProcedureColumnMetaDataAccess,我们可以指定我们希望绕过元数据查找的任何处理,只使用声明的参数。另一种可能出现的情况是,参数中的一个或多个参数具有默认值,我们希望将它们排除在调用之外。要做到这一点,我们只需调用useInParameterNames来指定要包含的in参数名称的列表。

这是示例代码

代码语言:javascript
复制
public class JdbcActorDao implements ActorDao {
private SimpleJdbcCall procReadActor;

public void setDataSource(DataSource dataSource) {
    JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
    jdbcTemplate.setResultsMapCaseInsensitive(true);
    this.procReadActor =
            new SimpleJdbcCall(jdbcTemplate)
                    .withProcedureName("read_actor")
                    .withoutProcedureColumnMetaDataAccess()
                    .useInParameterNames("in_id")
                    .declareParameters(
                            new SqlParameter("in_id", Types.NUMERIC),
                            new SqlOutParameter("out_first_name", Types.VARCHAR),
                            new SqlOutParameter("out_last_name", Types.VARCHAR),
                            new SqlOutParameter("out_birth_date", Types.DATE)
                    );
}


//  ... additional methods

}

我不知道为什么,但是withNamedBinding()方法似乎不能在ms上正常工作,并创建语法错误。因此,在上面的解决方案中,主要的工作是

  1. 不要使用.withNamedBinding()方法。
  2. 使用.withoutProcedureColumnMetaDataAccess()方法。
  3. 在将参数数组传递给.useInParameterNames()方法时,请确保按照proc中声明的顺序传递它(因为我们没有使用名称绑定)。在上一个参数之前,我的out参数被声明为几个参数,因此当将var转换为int时,它给了我错误,因为我的out param是int。

所以现在您的解决方案应该如下所示:

代码语言:javascript
复制
this.simpleJdbcCall = new SimpleJdbcCall(jdbcTemplateObject)
                .withSchemaName("dbo")
                .withProcedureName("EmployeeDetails")
                .withoutProcedureColumnMetaDataAccess()
                .useInParameterNames(paramNameArray)
                .returningResultSet("detailReportData", BeanPropertyRowMapper.newInstance(Employee.class));
        Map<String,Object> out = this.simpleJdbcCall.execute(sqlSource);

试试看这个是否适合你。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54474481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档