Oracle 存储过程 java.sql.SQLException : Invalid column type: 2012 (REF_CURSOR)

标签 oracle stored-procedures jdbc sys-refcursor ref-cursor

Oracle 11g、Java 8、ojdbc8/ojdbc7

带有 OUT REF_CURSOR 的存储过程,例如,

create or replace procedure foo(employeeId IN number, c OUT SYS_REFCURSOR) AS
BEGIN
    open c for select * from Employee where id = employeeId;
END;

从 sqlplus 中,它工作正常。

JDBC调用过程:

CallableStatement statement = connection.prepareCall("{call foo(?,?)}");
statement.setObject(1, 100);
statement.registerOutParameter(2, java.sql.Types.REF_CURSOR);  // ERROR here
statement.execute();

错误:

java.sql.SQLException: Invalid column type: 2012

类型 2012 是 Types.REF_CURSOR。

使用 oracle 11g 尝试了 ojdbc7 和 ojdbc8,同样的错误。
Oracle 11g 支持 REFCURSOR。 java 8 定义了 Types.REF_CURSOR。对于 11g,我应该使用哪个 Oracle jdbc 驱动程序?

最佳答案

我在我的项目中使用了这段代码,效果很好

@Override
public ResultSet getCorrespondenceDetail(Long id)  {
    String sql="{call dbpk_person_correspondence.get_report_detail(?,?   )}";
    Connection conn = JDBCUtility.getConnection();
    ResultSet result = null;
    CallableStatement cstmt;
    try {
        cstmt = conn.prepareCall(sql);
    cstmt.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);
    cstmt.setLong(2,id);
    cstmt.execute();
    result = (ResultSet)cstmt.getObject(1);
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return result;
}

项目依赖:

<dependency>
        <groupId>com.oracle</groupId>
        <artifactId>ojdbc6</artifactId>
        <version>11.2.0</version>
</dependency>

关于Oracle 存储过程 java.sql.SQLException : Invalid column type: 2012 (REF_CURSOR),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48847731/

相关文章:

java - 使用过程从数据库中获取数据

java - 处理 jdbc 时关闭连接的最佳实践是什么

java - JDBC 中的连接是什么?

oracle - int 值,只有正项

php - 我应该使用存储过程来执行复杂的 SELECT 查询吗?

mysql - 更新 TIME mysql 存储过程

sql - 如何将 vb.net 中日期的空值传递给 sql 存储过程?

java - JDBC 驱动程序类型 1 和 2

sql - 如何在Oracle中仅选择值变化?

java - Jenkins Build - 找不到 Java 类