当前位置: 首页 > 知识库问答 >
问题:

Oracle存储过程java.sql.sqlException:无效的列类型:2012(REF_CURSOR)

许涵容
2023-03-14

Oracle 11g、Java 8、OJDBC8/OJDBC7

create or replace procedure foo(employeeId IN number, c OUT SYS_REFCURSOR) AS
BEGIN
    open c for select * from Employee where id = employeeId;
END;
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

使用Oracle11g尝试ojdbc7和ojdbc8,出现相同错误。
Oracle11g支持RefCursor。Java8定义了types.ref_cursor。对于11g我应该使用哪个oracle jdbc驱动程序?

共有1个答案

司易安
2023-03-14

我在我的项目中使用了这段代码,它工作得很好

@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调用该过程。我的密码是, 即使我正在获取记录,值也是空的。这意味着如果输出为2行,则while条件执行并打印为空。在SQL Developer中,它工作得很好。提前道谢。

  • 我可以在Oracle中通过ODBC执行一批存储过程吗?存储过程具有我使用参数标记绑定的输入参数。 在SQLServer中,我有这个功能,在DB2中,我只能进行批处理插入/更新,但我不能从ODBC/C代码批处理存储过程。 Oracle似乎支持插入语句的批处理,如果使用JDBC,也可以批处理存储过程。 是否可以做同样的事情,但使用对存储过程和ODBC的调用? 谢谢

  • 我是Oracle的初学者,我声明了这个对象类型: 我希望在我的存储过程中使用该对象: 但是当编译过程时,我得到了这个错误: 错误(2,14):PLS-00201:必须声明标识符“T1” 我怎样才能写出正确的程序?谢谢大家。

  • 现在,问题是,虽然我可以获得存储过程返回的结果,但该结果没有转换为Java类(TNapraviNalog),所以我必须手动执行此操作。我可以用TNapraviNalog的实例(stmt.SetObject(1,ParamValues.get(0));)成功调用Oracle过程,但无法将结果转换为TNapraviNalog。我真的很想有一个 但是,这一行会导致异常(java.lang.ClassCa

  • 为了使用Oracle存储过程学习Hibernate4.1,我尝试使用一个尽可能简单的示例:1。%2中没有传递参数。SYS_REFCURSOR作为一个返回参数 我得到的是一个异常:“org.hibernate.exception.GenericJDBcException:无效列索引”。在网上搜索几个小时来解决这个问题并没有什么帮助。 ================================异

  • 我需要对一个参数为PL/SQL表的过程进行JDBC调用。我正在尝试结构对象。但是我没有做正确的事情。我得到错误: ORA-04043:对象“斯科特”。“对象列表结构”不存在。 以下是代码片段: 参数“?”对于本程序,类型为: 我们非常感谢任何能让我们成功的见解谢谢