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

Posted

技术标签:

【中文标题】如何在存储过程中使用游标?【英文标题】:How to use cursors in stored procedure? 【发布时间】:2019-01-24 19:07:53 【问题描述】:

我目前正在处理 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;

【问题讨论】:

如果您需要我们的帮助,您必须向我们展示您正在调用的存储过程的签名,即声明的参数,并向我们展示您当前如何尝试从 Java 调用它. @Andreas,感谢您的回复。我为你更新了问题。请看一下:) 【参考方案1】:

您需要将返回结果集添加到调用中,并在 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));

【讨论】:

以上是关于如何在存储过程中使用游标?的主要内容,如果未能解决你的问题,请参考以下文章

如何在oracle的存储过程中手动将行添加到游标中

oracle存储过程中循环for in是如何使用的

如何从存储过程返回的游标将数据插入临时表

如何在Oracle中使用Java存储过程

MySQL存储过程和游标

如何使用c#执行返回多个游标的oracle存储过程