如何在存储过程中使用游标?

时间:2019-01-24 19:07:54

标签: java database stored-procedures plsql

我目前正在处理PL-SQL存储过程,因此从应用程序(REST应用程序)中,我向Store_procedure发送了几个IN参数,在过程中,我正在解析一些输入,并且很少有具有IN OUT参数的字段而其中很少是光标。

这是现有程序,正在被xml中的旧版应用程序使用。我正在做的就是在其中添加一个新的REST层。

现在,我收到此例外

"SQL state [99999]; error code [17004]; Invalid column type: 1111; nested exception is java.sql.SQLException: Invalid column type: 1111]"

我确实检查了所有列以及所有列,但仍然无法成功。 我还试图在响应会回来时映射事物。

谢谢。

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

 SQL state [99999]; error code [17023]; Unsupported feature: 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);```

I am using the ResultSetExtractor interface to map the result set for the cursor. This is the class:

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 state [99999]; error code [17023]; Unsupported feature: sqlType=-10;

1 个答案:

答案 0 :(得分:0)

您需要将返回结果集添加到调用中,并在 Result 类中声明所有光标输出字段名称。

simpleJdbcCall.withCatalogName(PACKAGE).withProcedureName(PROCEDURE_TEST)
.declareParameters(
new SqlParameter("p_input_stream", OracleTypes.VARCHAR), 
new SqlInOutParameter("p_cur", OracleTypes.CURSOR))
..returningResultSet("p_cur", BeanPropertyRowMapper.newInstance(Results.class));