.nextval JDBC插入问题

7

我尝试使用序列 .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: 无效数字

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


这个是否应该从0开始索引?编辑:不是。 - Stefan H
你的序列名称是User吗?它需要是SequenceName.NextVal。此外,除了sequencename.NextVal之外,只需使用预处理语句即可。 - Stefan H
我不使用Oracle,但在PostgreSQL中,它们(作为“SERIAL PRIMARY KEY”类型创建的序列)会在每次“INSERT”时自动递增。通常您希望从“INSERT”语句中省略它,以便DB自己处理它。因此,在您的情况下,您可能会从SQL中省略“USER_PK”列。MySQL、DB2和SQLServer也有类似的结构。 - BalusC
@BalusC:SQL Server 2011 将支持序列 - 现在只需要让 MySQL 实现它 :/。据我所知,Oracle 没有类似于 PostgreSQL 的 serial 的任何东西。 - OMG Ponies
1个回答

16

问题在于第一列是数字数据类型,但您的准备语句正在提交字符串/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是一个已经存在的序列 -- 如有需要请更改。


3
就我个人而言,如果由我决定,这将是一个Oracle函数。然后序列引用将在该函数中,只需提供插入相同的参数即可。 - OMG Ponies
非常顺利,谢谢!:D - Skizo-ozᴉʞS ツ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接