带有 rs.getInt() 或 getLong() 的 Oracle 12c 中的 Sequence.NEXTVAL 失败 - 那么它返回啥数据类型?
Posted
技术标签:
【中文标题】带有 rs.getInt() 或 getLong() 的 Oracle 12c 中的 Sequence.NEXTVAL 失败 - 那么它返回啥数据类型?【英文标题】:Sequence.NEXTVAL in Oracle 12c with rs.getInt() or getLong() fails - so what datatype it returns?带有 rs.getInt() 或 getLong() 的 Oracle 12c 中的 Sequence.NEXTVAL 失败 - 那么它返回什么数据类型? 【发布时间】:2015-02-02 08:06:47 【问题描述】:我正在使用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)
【问题讨论】:
你检查if ( rs.next() )
了吗?也许你把序列的名字弄错了。
“不起作用”不是已知的 Oracle 错误消息。您得到的错误究竟是什么?异常堆栈跟踪?
如上,请贴出您尝试上述方法时遇到的错误。
另外,请贴出完整的代码sn-p!
是的,我检查了 if ( rs.next() )。抱歉,我会换个帖子。
【参考方案1】:
PreparedStatement
s 不能绑定对象名称,只能绑定值。如果您尝试像上面那样绑定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);
【讨论】:
现在可以了,谢谢,我明白了这个问题。对我来说非常好的体验。以上是关于带有 rs.getInt() 或 getLong() 的 Oracle 12c 中的 Sequence.NEXTVAL 失败 - 那么它返回啥数据类型?的主要内容,如果未能解决你的问题,请参考以下文章
java.sql.SQLException: 无法转换为内部表示
java编程:用object数组从mysql数据库中读取数据,data11[i][0] = rs.getInt(1);报错了
java sql SQLException Invalid value for getInt -'zhangsan'