首页 > 解决方案 > Spring 中 SqlInOutParameter 的功能错误引用游标不受支持

问题描述

我必须执行一个有 13 个参数的存储过程。有输入、输出和输入/输入参数。我正在从 Spring Boot Java Web 服务调用存储过程。存储过程引发以下异常:

SQL 状态 [99999];错误代码 [17023];不支持的功能:sqlType=-10;

当我使用作为参考光标的输入/输出参数时。(我为字符串或整数类型的输入、输出或输入/输出参数创建了一个存储过程,它工作正常。但问题在于光标。

这是调用存储过程的代码:

MapSqlParameterSource parameterSource = new MapSqlParameterSource();
parameterSource.addValue("p_input_stream", input);
parameterSource.addValue("p_cur", null);

simpleJdbcCall.withCatalogName(PACKAGE).withProcedureName(PROCEDURE_TEST);
simpleJdbcCall.declareParameters(
    new SqlParameter("p_input_stream", OracleTypes.VARCHAR), 
    new SqlInOutParameter("p_cur", OracleTypes.CURSOR, new LoadCursorMapper()));
result = simpleJdbcCall.execute(parameterSource);

我正在使用 ResultSetExtractor 接口来映射游标的结果集。这是课程:

public class LoadCursorMapper implements ResultSetExtractor<LoadCursor> {

    public LoadCursor extractData(ResultSet resultSet) throws SQLException, DataAccessException {

         LoadCursor trailer = new LoadCursor();
         trailer.setTrlrNbr(resultSet.getBigDecimal("trlr_nbr"));
         trailer.setTrlrPrefix(resultSet.getString("trlr_prefix"));           
         trailer.setCatgoryCodeLoadCondStat(resultSet.getString("catg_code_load_cond_stat"));
         trailer.setDetailCodeLoadCondStat(resultSet.getString("detl_code_load_cond_stat"));

        return trailer;
    }
}

我不确定我声明游标参数的方式是否正确。这段代码特别是:

new SqlInOutParameter("p_cur", OracleTypes.CURSOR, new LoadCloseSummaryTrailerCursorMapper()));

运行服务时,我收到错误:

SQL 状态 [99999];错误代码 [17023];不支持的功能:sqlType=-10;

任何建议,将不胜感激。

更新 我也尝试了 RowMapper 接口并得到同样的错误。

如何在 Java 中使用 Oracle 游标作为输入参数?

标签: javaspring-bootoracle11g

解决方案


这就是我解决问题的方法......首先,我没有在 MapSqlParameterSource 中添加输入/输出参数作为输入参数。我的实例中的这些值始终为空。所以我的 MapSqlParameterSource 看起来像这样:

MapSqlParameterSource parameterSource = new MapSqlParameterSource();
parameterSource.addValue("p_input_stream", input);

然后我在 JdbcSimpleCall 中将该参数声明为仅输出参数,如下所示:

simpleJdbcCall.declareParameters(
    new SqlParameter("p_input_stream", OracleTypes.VARCHAR), 
    new SqlOutParameter("p_cur", OracleTypes.CURSOR, new LoadCursorMapper()));

这对我有用...


推荐阅读