我想用SimpleJdbcCall执行带有动态参数的存储过程。总之,我在server中有6个可选参数,其中我必须能够传递任何参数或零参数。我的SP在MS中执行得很好。但不是由SimpleJdbcCall。我尝试了很多种方式,其中之一就是withNamedBinding。但是它给出了"=“附近的输入语法错误,如下所示。
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:在'=‘附近不正确的语法。
发布于 2020-06-18 13:01:25
我曾经遇到过类似的问题,在这堆栈溢出问题上也很少找到解决方案。但在我的例子中,我使用的是,这给了我同样的语法错误。在搜索解决方案时,我遇到了Spring的这示例(参见11.5.6节)。声明用于SimpleJdbcCall的参数)。万一链接不可用,请看下面的内容
我们可以选择显式地声明一个、一些或所有参数。参数元数据仍在使用中。通过调用方法withoutProcedureColumnMetaDataAccess,我们可以指定我们希望绕过元数据查找的任何处理,只使用声明的参数。另一种可能出现的情况是,参数中的一个或多个参数具有默认值,我们希望将它们排除在调用之外。要做到这一点,我们只需调用useInParameterNames来指定要包含的in参数名称的列表。
这是示例代码
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上正常工作,并创建语法错误。因此,在上面的解决方案中,主要的工作是
所以现在您的解决方案应该如下所示:
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);试试看这个是否适合你。
https://stackoverflow.com/questions/54474481
复制相似问题