使用REF CURSOR通过Java程序检索ResultSet会引发错误

时间:2019-05-24 08:48:09

标签: java oracle

我正在尝试遵循this guide以便从存储过程中检索结果集。

存储过程(Oracle 12c):

CREATE OR REPLACE PROCEDURE GetLastActions
(
  p_actions IN OUT SYS_REFCURSOR
)
IS
BEGIN
  OPEN p_actions FOR SELECT ACTION_ID, ACTION_DATE FROM ACTIONS FETCH NEXT 10 ROWS ONLY;
END;

Java中的调用(我正在使用JDK 1.6):

String qLoadTmpData = "{call GetLastActions(?)}";
Connection con;
try {
    Connection con = getConnection();
    con.setAutoCommit(false);
    CallableStatement stmt = con.prepareCall(qLoadTmpData);
    stmt.setNull(1, Types.REF);
    stmt.registerOutParameter(1, Types.REF);
    stmt.execute();
    ResultSet rs = (ResultSet)stmt.getObject(1);
    System.out.println("Last actions:");
    while(rs.next()) {
        System.out.println(rs.getString(1) + "  => " rs.getDate(2));
    }
} catch (Exception e) {
    e.printStackTrace();
    throw new DaoException("Erreur lors de la recuperation des donnees !", e);
} finally {
    closeConnection(con);
}

错误:

java.sql.SQLException: Invalid column type: sqlType=2006
    at oracle.jdbc.driver.OraclePreparedStatement.setNullCritical(OraclePreparedStatement.java:4696)
    at oracle.jdbc.driver.OraclePreparedStatement.setNull(OraclePreparedStatement.java:4578)
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.setNull(OraclePreparedStatementWrapper.java:1285)
    at com.company.project.documents.report1.dao.ReportDAO.getRapportResultat(ReportDAO.java:59)
    at com.company.project.documents.report1.service.Service.getResultat(Service.java:40)
    at com.company.project.documents.report1.generator.Generator.generate(Generator.java:20)
    at com.company.project.documents.DocumentsGeneratorMain.main(DocumentsGeneratorMain.java:47)

现在,真正的查询比我上面测试的示例复杂得多,这就是为什么我使用游标和存储过程来获取结果。

我想念什么?

更新

我指的链接描述了与EnterpriseDB相关的方法,这里是the same approach for Oracle,我已对其进行了测试并得到了相同的错误。

1 个答案:

答案 0 :(得分:1)

  

我想念什么?

我想您丢失了您要使用Oracle数据库的PostgreSQL文档/示例的信息。这行不通。不同的数据库和SQL方言对游标的支持也不同。

这里有一些问答,展示了如何将REF CURSOR与Oracle数据库一起使用。


  

(我正在使用JDK 1.6)

也许您还缺少真正,确实需要升级Java平台的信息。

对于那些没有支持合同的人来说,Java 6的使用寿命已超过六年。截至2018年12月,即使对于具有Oracle Java SE扩展支持合同的人来说,它的生命周期也将终止: