java - 无法使用 StoredProcedureItemReader 读取 REF_CURSOR

标签 java spring oracle jdbc spring-batch

我尝试调用存储过程

create or replace PROCEDURE "PROC"(cur OUT SYS_REFCURSOR)

用这个 bean 。

@Bean
    StoredProcedureItemReader<?> itemReader() {
        StoredProcedureItemReader<?> storedProcedureItemReader = new StoredProcedureItemReader<>();
        storedProcedureItemReader.setDataSource(dataSource);
        storedProcedureItemReader.setProcedureName("PROC");
        storedProcedureItemReader.setRefCursorPosition(1);
        storedProcedureItemReader.setRowMapper(new ColumnMapRowMapper());
        storedProcedureItemReader.open(new ExecutionContext());
        return storedProcedureItemReader;
    }

但是我明白了

org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.open(AbstractItemCountingItemStreamItemReader.java:134)
    ... 54 more
Caused by: java.sql.SQLException: Invalid column index
    at oracle.jdbc.driver.OracleCallableStatement.registerOutParameterInternal(OracleCallableStatement.java:125)
    at oracle.jdbc.driver.OracleCallableStatement.registerOutParameter(OracleCallableStatement.java:304)
    at oracle.jdbc.driver.OracleCallableStatement.registerOutParameter(OracleCallableStatement.java:393)
    at oracle.jdbc.driver.OracleCallableStatementWrapper.registerOutParameter(OracleCallableStatementWrapper.java:1569)
    at org.springframework.batch.item.database.StoredProcedureItemReader.openCursor(StoredProcedureItemReader.java:202)
    ... 56 more

如何只用一个游标调用 PROC 并迭代结果?

最佳答案

我认为你需要为 out 参数 cur 添加一个参数给 reader。在打开 storedProcedureItemReader 之前尝试添加以下行:

    storedProcedureItemReader.setParameters(new SqlParameter[] { new SqlParameter("cur", OracleTypes.CURSOR) });

关于java - 无法使用 StoredProcedureItemReader 读取 REF_CURSOR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33247415/

相关文章:

java - hibernate ogm mongo db,如何获取集合计数?

java - 砍掉未使用的字节数据类型

java - 未找到 HikariCP LoggerFactory 类定义

java - OAuth token invalid_grant

java - spring 应用程序不启动 : SAXParseException: Document root element "beans", 必须匹配 DOCTYPE root "null"

Oracle获取存储过程的上次修改日期

Java 控制台输出重叠扫描器

java - Spring boot 的 Arango Edge 创建错误

sql - 基于子查询显示列

sql - TRIGGER AND COUNT 限制计数值