我正在尝试遵循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,我已对其进行了测试并得到了相同的错误。
答案 0 :(得分:1)
我想念什么?
我想您丢失了您要使用Oracle数据库的PostgreSQL文档/示例的信息。这行不通。不同的数据库和SQL方言对游标的支持也不同。
这里有一些问答,展示了如何将REF CURSOR与Oracle数据库一起使用。
(我正在使用JDK 1.6)
也许您还缺少真正,确实需要升级Java平台的信息。
对于那些没有支持合同的人来说,Java 6的使用寿命已超过六年。截至2018年12月,即使对于具有Oracle Java SE扩展支持合同的人来说,它的生命周期也将终止: