Использование REF CURSOR для получения ResultSet с помощью Java-программы выдает ошибку - PullRequest
0 голосов
/ 24 мая 2019

Я пытаюсь следовать этому руководству , чтобы извлечь набор результатов из хранимой процедуры.

Хранимая процедура (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 , который я тестировал и получил ту же ошибку.

1 Ответ

1 голос
/ 24 мая 2019

Что мне не хватает?

Я думаю, вам не хватает того, что вы пытаетесь использовать документацию / примеры для PostgreSQL с базой данных Oracle.Это не сработает.Различные базы данных и диалекты SQL поддерживают курсоры по-разному.

Вот некоторые вопросы и ответы, которые показывают, как использовать REF CURSOR с базами данных Oracle.


(яиспользуя JDK 1.6)

Может быть, вам также не хватает того, что вам действительно нужно обновить платформу Java.

Java 6 была прекращена для людей без поддержкиконтракт уже более шести лет.По состоянию на декабрь 2018 года срок его действия истек даже для людей с контрактом на расширенную поддержку Oracle Java SE:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...