Ошибка Sequence.NEXTVAL в Oracle 12c с rs.getInt () или getLong () - так какой тип данных он возвращает?

1

Я получаю следующее значение последовательности с ps = connection.prepareStatement("select seq.nextval from dual"); Но ни getLong() ни getInt() работают. Итак, как правильно получить значение из ResultSet?

полный код:

public static long seqGetNextValue(String sequence) {
    Connection connection = Util.getConnection();
    PreparedStatement ps = null;
    ResultSet rs = null;
    Long value = new Long(0);

    try {
        ps = connection.prepareStatement("select ? from dual");
        ps.setString(1, sequence);
        rs = ps.executeQuery();
        if (rs.next()) {
            value = rs.getInt(1);
        }
        System.out.println("Next payment Id: " + value);
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } finally {
        Util.close(connection, rs, ps);
    }
    return value;
}

Исключение составляет ниже, для getInt это выглядит одинаково:

java.sql.SQLException: Fail to convert to internal representation
    at oracle.jdbc.driver.CharCommonAccessor.getLong(CharCommonAccessor.java:258)
    at oracle.jdbc.driver.T4CVarcharAccessor.getLong(T4CVarcharAccessor.java:562)
    at oracle.jdbc.driver.GeneratedStatement.getLong(GeneratedStatement.java:228)
    at oracle.jdbc.driver.GeneratedScrollableResultSet.getLong(GeneratedScrollableResultSet.java:620)
    at org.apache.tomcat.dbcp.dbcp.DelegatingResultSet.getLong(DelegatingResultSet.java:228)
    at org.apache.tomcat.dbcp.dbcp.DelegatingResultSet.getLong(DelegatingResultSet.java:228)
    at util.Util.seqGetNextValue(Util.java:85)
  • 1
    Вы проверили, if ( rs.next() ) ? Возможно, вы ошиблись названием последовательности.
  • 6
    « не работает » - не известное сообщение об ошибке Oracle. Какую именно ошибку вы получаете? Исключение Stacktrace?
Показать ещё 5 комментариев
Теги:
jdbc
sequence
prepared-statement

1 ответ

4
Лучший ответ

PreparedStatement не может связывать имена объектов, просто значения. Если вы seq.nextval привязать seq.nextval как вы делали выше, вы фактически привязываете строковый литерал 'seq.nextval', поэтому ваш код эффективен, делая следующее:

SELECT 'seq.nextval' -- Note that this is a string!
FROM   dual

Теперь очевидно, почему getInt и getLong не работают - вы не запрашиваете число.

TL; DR - вы не можете привязывать имя последовательности и должны просто жестко закодировать его в инструкции (или использовать строковое манипулирование/конкатенацию для создания запроса). Как только вы это сделаете, вы можете использовать getInt или getLong, в зависимости от значений, которые вы ожидаете получить. Например:

try {
    ps = connection.prepareStatement("select " + sequence + " from dual");
    rs = ps.executeQuery();
    if (rs.next()) {
        value = rs.getInt(1);
    }
    System.out.println("Next payment Id: " + value);
} catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} finally {
    Util.close(connection, rs, ps);
}
  • 0
    Теперь это работает, спасибо, я понял проблему. Очень хороший опыт для меня.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню