java - SimpleJdbcCall 不适用于存储函数

标签 java spring jdbc db2 stored-functions

我正在尝试从 Java 执行 DB2 上的存储函数。调用它的函数和代码与 Spring 文档示例 https://docs.spring.io/spring/docs/current/spring-framework-reference/html/jdbc.html#jdbc-simple-jdbc-call-3 中的非常相似。 。这是函数声明:

CREATE FUNCTION ST_CLIENT_SEGMENT( p_oib VARCHAR(11) )
    RETURNS VARCHAR(10)
    NO EXTERNAL ACTION

代码如下:

//version1
SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(jdbcTemplate)
    .withSchemaName("VLIB").
    .withFunctionName("ST_CLIENT_SEGMENT")
SqlParameterSource in = new MapSqlParameterSource().addValue("p_oib", "123");
return simpleJdbcCall.executeFunction(String.class, in);

//version2
SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(jdbcTemplate)
    .withSchemaName("VLIB")
    .withFunctionName("ST_CLIENT_SEGMENT");
simpleJdbcCall.declareParameters(new SqlParameter("p_oib", Types.VARCHAR));
return simpleJdbcCall.executeFunction(String.class, "123");

//the same exception
//Caused by: java.sql.SQLException: [SQL0440] Routine ST_CLIENT_SEGMENT in VLIB not found with specified parameters.

有谁知道为什么会发生这种情况吗?当我从 SQL 客户端调用该函数时,一切正常。

最佳答案

我的一位同事找到了解决方案。看来这是一个DB2问题http://www.itjungle.com/fhg/fhg102506-story01.html 。 我尝试了另一个 SQL,它也给了我一个异常

jdbcTemplate.queryForObject("values vlib.ST_CLIENT_SEGMENT(?)", new Object[] {oib}, String.class);
//Caused by: java.sql.SQLException: [SQL0418] Use of parameter marker not valid.

此更改后一切正常

jdbcTemplate.queryForObject("values vlib.ST_CLIENT_SEGMENT( CAST( ? as CHAR) )", new Object[] {oib}, String.class);

关于java - SimpleJdbcCall 不适用于存储函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41142567/

相关文章:

java - 需要在JTable中动态添加JCheckBox

java - 给定一个 ParameterizedType,我如何创建这种类型的实例?

java - 无法在我的项目中创建唯一的键约束

java - JDBC 连接池监控 GlassFish

java - 在 Java 中为给定的结果集生成 MySQL 查询

java - Android自定义相机预览?

java - 如何使用 guice 注入(inject)器动态绑定(bind)映射

java - 如何在 Spring Data MongoDB 中使用乐观锁定?

Spring MVC i18n Hibernate 验证

grails - AWS Elastic Beanstalk故障:RDS连接错误:用户 'sa'的访问被拒绝