带有 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】:

PreparedStatements 不能绑定对象名称,只能绑定值。如果您尝试像上面那样绑定seq.nextval,您实际上是在绑定字符串文字'seq.nextval',因此您的代码可以有效地执行以下操作:

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

现在很明显为什么 getIntgetLong 不起作用 - 你不是在查询数字。

TL;DR - 您不能绑定序列的名称,而应该在语句中对其进行硬编码(或使用字符串操作/连接来创建查询)。完成此操作后,您可以使用getIntgetLong,具体取决于您希望获得的值。例如:

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: 无法转换为内部表示

JDBC中如何获取SUM函数返回的结果

java编程:用object数组从mysql数据库中读取数据,data11[i][0] = rs.getInt(1);报错了

java sql SQLException Invalid value for getInt -'zhangsan'

while(rs.next())与 if(rs.next())的区别

java中从数据库中模糊查询问题