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

Simplejdbccall存储过程与Named绑定true

越霖
2023-03-14

我想用SimpleJdbcCall执行带有动态参数的存储过程。在SQL服务器SP中,我总共有6个可选参数,其中我必须能够通过任何参数或不通过任何参数。我的SP在MS Studio中执行得很好。但不是通过SimpleJdbcCall。我尝试了很多方法,其中之一是使用NamedBding。但是它会给“=”附近的输入语法错误,如下所示。

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:14:49DEBUG SimpleJdbcCall: 405-以下参数用于call{call dbo。员工详细信息(empCode=

共有1个答案

姜聪
2023-03-14

我遇到过类似的问题,在这个堆栈溢出问题中找到了一些解决方案。但是在我的例子中,我使用的是MS-SQL服务器,它给了我同样的语法错误。在寻找解决方案时,我遇到了这个Spring的例子(见第11.5.6节。声明用于SimpleJdbcCall的参数)。以防万一链接不可用,下面是它的说明

我们可以选择显式声明一个、部分或全部参数。参数元数据仍在使用中。通过调用WithOutProcedureRecolumnMetadataAccess方法,我们可以指定希望绕过对潜在参数的元数据查找的任何处理,而只使用声明的参数。另一种可能出现的情况是,一个或多个in参数具有默认值,我们希望将它们排除在调用之外。为此,我们只需调用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 sql server一起正常工作,并导致语法错误。因此,在上述解决方案中,解决方法是

  1. 不使用. with NamedBding()方法。
  2. 使用. outoutSyserdureClonMetaDataAccess()方法。
  3. 在将参数数组传递给. useInParameterNames()方法时,请确保按proc中声明的顺序传递它(因为我们没有使用name绑定)。我的out参数在最后一个参数之前声明了几个参数,因此在将var转换为int时给我错误,因为我的out参数是int。

所以现在你的解决方案应该是这样的:

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);

试试看这对你是否有效。

 类似资料:
  • 我有一个使用SimpleJDBCCall调用DB过程的DAO函数。但是,我无法读取存储过程返回的CLOB数据。当我尝试对返回的CLOB值(result.get(“out_rtn_xml”))执行.toString()时,我只在字符串中得到以下内容:oracle.sql.CLOB@f762282a 下面是代码片段。

  • 问题内容: 我正在尝试添加分页存储过程的排序功能。 我该怎么做,到目前为止,我已经创建了这个。它工作正常,但是当传递参数时,它不起作用。 问题答案: 一种方法(可能不是最好的方法)是使用动态SQL 这是 SQLFiddle 演示

  • 我试图使用Spring JDBC模板调用postgres数据库中的存储过程。通过yaml配置文件完成连接,以指示要使用的当前架构: jdbc:postgresql://localhost:5455/userdb?currentSchema=customschema 直接从jdbc模板完成的每个查询都使用了正确的当前模式“自定义模式”。但是,只有从SimpleJdbcCall执行以调用存储过程是在p

  • 我正在创建多个 Azure 函数(HTTP 触发器)来从 blob 存储中获取内容,获取单个 blob 的几个元数据值,并获取特定 blob 类型的所有元数据属性。 我对使用绑定与使用blob存储的rest API与azure-storage sdk感到困惑。 创建azure函数时使用哪种方法最好?如果您能给我指出一些此类示例留档,那也会很有帮助。谢谢你。

  • 数据访问层支持存储过程调用,调用数据库存储过程使用下面的方法: $resultSet = Db::query('call procedure_name'); foreach ($resultSet as $result) { } 存储过程返回的是一个数据集,如果你的存储过程不需要返回任何的数据,那么也可以使用execute方法: Db::execute('call procedure_name'

  • 问题内容: 我有一个应用程序,每小时执行约20000次DATA-OPERATIONS DATA- OPERATION总共具有30个参数(用于所有10个查询)。有些是文本,有些是数字。某些Text参数最长为10000个字符。 每个DATA-OPERATION都执行以下操作: 单个DATA-OPERATION,可在数据库中插入/更新多个表(约10个)。 对于每一次DATA-OPERATION,我都会建