Java .nextval JDBC插入问题

Java .nextval JDBC插入问题,java,sql,oracle,jdbc,ora-01722,Java,Sql,Oracle,Jdbc,Ora 01722,我尝试将sequence.nextval作为主键插入到表中,Java中的sql是 sql = "INSERT INTO USER (USER_PK, ACCOUNTNUMBER, FIRSTNAME, LASTNAME, EMAIL ) VALUES (?,?,?,?,?)"; ps = conn.prepareStatement(sql); ps.setString(1, "User.nextval"); ps.setS

我尝试将sequence.nextval作为主键插入到表中,Java中的sql是

sql = "INSERT INTO USER 
         (USER_PK, ACCOUNTNUMBER, FIRSTNAME, LASTNAME, EMAIL ) 
       VALUES 
         (?,?,?,?,?)";
   ps = conn.prepareStatement(sql);
   ps.setString(1, "User.nextval");
   ps.setString(2, accountNumber);
   ps.setString(3, firstName);
   ps.setString(4, lastName);
   ps.setString(5, email);
但是,错误是
ORA-01722:无效号码


所有其他字段都是正确的,我认为这是顺序问题,对吗?

问题是第一列是数字数据类型,但您准备的语句提交的是字符串/VARCHAR数据类型。该语句按原样运行,Oracle没有机会将您对nextval的使用转换为获取序列值

以下是通过Java的PreparedStatement语法提供的另一种选择:

sql = "INSERT INTO USER 
        (USER_PK, ACCOUNTNUMBER, FIRSTNAME, LASTNAME, EMAIL ) 
       VALUES 
        (user.nextval, ?, ?, ?, ?)";
ps = conn.prepareStatement(sql);
ps.setString(1, accountNumber);
ps.setString(2, firstName);
ps.setString(3, lastName);
ps.setString(4, email);

这假设
user
是一个现有序列——根据需要进行更改。

这应该是0索引吗?编辑:序列用户的名称是什么?它需要是SequenceName.NextVal。此外,只需对SequenceName以外的所有内容使用准备好的语句即可。NextValI不使用Oracle,但在PostgreSQL中,它们(创建为序列主键类型的序列)在每次插入时自动递增。您通常希望在
INSERT
语句中省略它,以便DB自己处理它。因此,在您的例子中,您可能会从SQL中省略
USER\u PK
列。MySQL、DB2和SQLServer也有类似的结构。@BalusC:SQLServer2011将支持序列-现在只需要让MySQL来做:/。据我所知,Oracle没有类似于PostgreSQL的
serial
的功能。不过就我个人而言,如果由我决定的话,这将是Oracle的功能。然后序列引用将出现在函数中,只需为插入提供相同的参数即可。效果非常好,谢谢!:D