春季:无法确定正确的呼叫签名 - 多个过程/功能/签名



我正在尝试从Oracle存储过程中获取数据。问题在于,在我们的数据库中,有一个函数和一个具有相同名称和相同参数的过程。

当我尝试称呼它时:

@Autowired
    public void setDataSource (@Qualifier("dataSource") DataSource dataSource) {
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
        jdbcTemplate.setResultsMapCaseInsensitive(true);
        this.functionGetSomeCode = new SimpleJdbcCall(jdbcTemplate)
                .declareParameters(new SqlOutParameter("RETURN", OracleTypes.NUMBER))
                .withFunctionName("get_some_code").withSchemaName("XXX").withCatalogName("some_pkg");
    }
    public Integer getSomeCode (String incoming) {
        SqlParameterSource incomingParameters = new MapSqlParameterSource().addValue("incoming", incoming);
        return functionGetSomeCode.executeFunction(Integer.class, incomingParameters);
    }

我有一个例外:

springframework.dao.InvalidDataAccessApiUsageException: Unable to determine the correct call signature - multiple procedures/functions/signatures

有没有办法处理这种情况而不要求DBA将功能/过程重命名为不同的事物?

我已经能够调用具有相同名称但并不总是有效的函数和过程。在您的示例中,看起来您没有声明输入参数。尝试将输入参数和输出参数声明尽可能与包装声明非常匹配的输入和输出参数。如果仍然不起作用,您可以尝试关闭ProcedureColummetAdataAccess,但请务必测试。

这是一个示例:

protected SimpleJdbcCall buildJdbcCall(JdbcTemplate jdbcTemplate) {
    SimpleJdbcCall call = new SimpleJdbcCall(jdbcTemplate)
            .withSchemaName(schema)
            .withCatalogName(catalog)
            .withFunctionName(functionName) 
            // can use withProcedureName(procedureName) for procedures 
            //.withReturnValue()
            //  .withoutProcedureColumnMetaDataAccess()  // may need this
            .declareParameters(buildSqlParameters());
    return call;
}
public SqlParameter[] buildSqlParameters() {
    return new SqlParameter[]{
        new SqlParameter("p_id", Types.VARCHAR),
        new SqlParameter("p_office_id", Types.VARCHAR),
        new SqlOutParameter("l_clob", Types.CLOB)
    };
}

如果您没有返回变量,则以下代码可以帮助您。我正面临着我的代码在没有声明of of参数的情况下正常工作的同一问题,因为功能没有访问。我通过将OUT参数称为返回来解决此问题。代码如下。

SimpleJdbcCall jdbcCall = new SimpleJdbcCall(jdbcTemplate.getDataSource()).withCatalogName("PACKAGE_NAME")
                .withFunctionName("MY_FUNCTION_NAME").withoutProcedureColumnMetaDataAccess().declareParameters(
                        new SqlOutParameter("RETURN", Types.TIMESTAMP),
                        new SqlParameter("XYX_Y", Types.DATE),
                        new SqlParameter("HH_HDU", Types.VARCHAR)
                        );
        jdbcCall.compile();
        MapSqlParameterSource in = new MapSqlParameterSource();
        in.addValue("XYX_Y", myDate);
        in.addValue("HH_HDU", "PQR");
        java.sql.Timestamp date =  jdbcCall.executeFunction(java.sql.Timestamp.class, in);

我也面临同一问题。我有2个具有相同名称的处理器,其中一个不同的参数" lang_code_in"。看起来这个问题仅是由于春季/春季启动应用程序而来的。因此,我添加了。

    final SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(dataSource).withCatalogName(catalogName)
            .withProcedureName(procedureName)
            .withoutProcedureColumnMetaDataAccess().
            .declareParameters(buildPullOrderSqlParameters());

但是之后,它开始给出以下错误: org.springframework.jdbc.badsqlgrammarexception:callableStatatementCallback;糟糕的SQL语法[{call npiadm.ccm_jigsaw_template_pkg.get_upc_xml_content(?,?,?,,?)}]};嵌套异常是Java.sql.sqlexception:ORA-06550:第1行,第7列:PLS-00306:呼叫" GET_UPC_XML_CONTENT"中的参数数字错误或类型ORA-06550:第1行,第7列:PL/SQL:语句忽略

然后,我添加了如下所示的所有In In In Incoms carams declareParameters()对象,并且开始工作正常。以下代码具有p_order_number_i在params中,p_err_msg_o in carams

public SqlParameter[] buildPullOrderSqlParameters() {
    return new SqlParameter[]{
            new SqlParameter("P_ORDER_NUMBER_I", Types.VARCHAR),
            new SqlOutParameter("p_err_msg_o", Types.VARCHAR)
    };
}

最新更新