SimpleJdbcCall总是省略函数调用中的第一个参数

时间:2018-05-04 10:06:35

标签: java oracle spring-boot oracle11g spring-jdbc

我尝试使用SimpleJdbcCall类来调用Oracle包中的函数,但每次调用都会忽略第一个输入参数。 我的代码如下所示:

SimpleJdbcCall call = new SimpleJdbcCall(jdbcTemplate.getJdbcTemplate())
                .withSchemaName("MY_SCHEMA")
                .withCatalogName("MY_PACKAGE")
                .withFunctionName("MY_FUNCTION")
                .withoutProcedureColumnMetaDataAccess()
                .declareParameters(new SqlParameter("FIRST_ARGUMENT", Types.VARCHAR), new SqlParameter("SECOND_ARGUMENT", Types.VARCHAR));
SqlParameterSource params = new MapSqlParameterSource().addValue("FIRST_ARGUMENT", "VALUE1").addValue("SECOND_ARGUMENT", "VALUE2");
Integer result = call.executeFunction(Integer.class, params);

我的职能是:

FUNCTION MY_FUNCTION(FIRST_ARGUMENTvarchar2, SECOND_ARGUMENTvarchar2) RETURN number;

stacktrace显示了这种错误:

org.springframework.jdbc.BadSqlGrammarException: CallableStatementCallback; bad SQL grammar [{? = call MY_SCHEMA.MY_PACKAGE.MY_FUNCTION(?)}];

已删除参数。仅使用一个参数调用另一个函数会引发类似的错误:

org.springframework.jdbc.BadSqlGrammarException: CallableStatementCallback; bad SQL grammar [{? = call MY_SCHEMA.MY_PACKAGE.MY_OTHER_FUNCTION()}];

我已尝试调试Spring代码,spring-boot-starter-jdbc:2.0.1.RELEASE2.0.0也是如此),并且我在org.springframework.jdbc.core.metadata.CallMetaDataContext类的代码中遇到了这段代码。拨打:

if (isFunction() || isReturnValueRequired()) {
            callString = "{? = call " +
                    (StringUtils.hasLength(catalogNameToUse) ? catalogNameToUse + "." : "") +
                    (StringUtils.hasLength(schemaNameToUse) ? schemaNameToUse + "." : "") +
                    procedureNameToUse + "(";
            parameterCount = -1;
        }
        else {
            callString = "{call " +
                    (StringUtils.hasLength(catalogNameToUse) ? catalogNameToUse + "." : "") +
                    (StringUtils.hasLength(schemaNameToUse) ? schemaNameToUse + "." : "") +
                    procedureNameToUse + "(";
        }

        for (SqlParameter parameter : this.callParameters) {
            if (!(parameter.isResultsParameter())) {
                if (parameterCount > 0) {
                    callString += ", ";
                }
                if (parameterCount >= 0) {
                    callString += createParameterBinding(parameter);
                }
                parameterCount++;
            }
        }
        callString += ")}";

如果我已经理解了代码,第一个参数将始终被忽略,我是对的吗? 有没有人在这种情况下取​​得成功?

微米。 Deinum是正确的,并且必须指定返回参数,我希望Spring在使用函数时自动添加它。 我的代码现在:

    SimpleJdbcCall call = new SimpleJdbcCall(jdbcTemplate.getJdbcTemplate())
                        .withSchemaName("MY_SCHEMA")
                        .withCatalogName("MY_PACKAGE")
                        .withFunctionName("MY_FUNCTION")
                        .withoutProcedureColumnMetaDataAccess()
                        .declareParameters(new SqlOutParameter("return",Types.INTEGER) 
                                            ,new SqlParameter("FIRST_ARGUMENT", Types.VARCHAR) 
                                            ,new SqlParameter("SECOND_ARGUMENT", Types.VARCHAR));
        SqlParameterSource params = new MapSqlParameterSource().addValue("FIRST_ARGUMENT", "VALUE1").addValue("SECOND_ARGUMENT", "VALUE2");
        Integer result = call.executeFunction(Integer.class, params);

0 个答案:

没有答案