【问题标题】:.nextval JDBC insert problem.nextval JDBC 插入问题
【发布时间】:2011-05-28 15:15:21
【问题描述】:

我尝试将序列.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: invalid number

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

【问题讨论】:

  • 这应该是 0 索引吗?编辑:没有
  • 是你序列用户的名字吗?它需要是 SequenceName.NextVal 另外,只需对所有内容使用准备好的语句,但 sequencename.NextVal
  • 我不做 Oracle,但在 PostgreSQL 中,它们(创建为 SERIAL PRIMARY KEY 类型的序列)在每个 INSERT 上自动递增。您通常希望从 INSERT 语句中省略它,以便数据库自己处理它。因此,在您的情况下,您可能会从 SQL 中省略 USER_PK 列。 MySQL、DB2 和 SQLServer 也有类似的结构。
  • @BalusC:SQL Server 2011 将支持序列 - 现在只需要让 MySQL 来完成它:/。据我所知,Oracle 没有任何类似于 PostgreSQL 的 serial 的东西。

标签: java sql oracle jdbc ora-01722


【解决方案1】:

问题是第一列是数字数据类型,但是您准备好的语句正在提交字符串/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 是一个现有的序列——改变以适应。

【讨论】:

  • 虽然就个人而言,如果由我来决定,这将是一个 Oracle 功能。然后序列引用将在函数中,只需为插入提供相同的参数。
  • 工作就像一个魅力谢谢! :D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-12
  • 1970-01-01
  • 1970-01-01
  • 2020-10-30
相关资源
最近更新 更多