Я пытаюсь следовать этому руководству , чтобы извлечь набор результатов из хранимой процедуры.
Хранимая процедура (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)
Теперь реальный запрос намного сложнее, чем в примере, который я тестировал выше, поэтому для извлечения результата я использую курсор и хранимую процедуру.
Чего мне не хватает?
UPDATE
Ссылка, на которую я ссылался, описывает подход, связанный с EnterpriseDB, вот тот же подход для Oracle , который я тестировал и получил ту же ошибку.