Я получаю следующее значение последовательности с 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)
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);
}
if ( rs.next() )
? Возможно, вы ошиблись названием последовательности.