如何在存储过程中使用游标?
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));
【讨论】:
以上是关于如何在存储过程中使用游标?的主要内容,如果未能解决你的问题,请参考以下文章