Java获取插入前记录的SQL下一个序列号

9
我有一个名为TestingID的变量,以及以下SQL语句在我的Java代码中。稍后将使用该SQL语句进行prepareStatement操作。
 int TestingID; 

 String sqlInsert = "INSERT INTO TESTING VALUES(TESTING_SEQ.NEXTVAL, ?, ?)";  
 ...  

 MethodA(TestingID);     //passing TestingID to MethodA

我需要获取新插入记录的下一个序列值,以便我可以在上面显示的另一个方法中使用它。请注意,此处的TestingID是指测试标识符的字段名。
4个回答

33

使用该方法时,你应该首先查询新的标识值(我看到你正在使用序列)。可以通过发出select语句来完成。

// This example is for Oracle

String sqlIdentifier = "select TESTING_SEQ.NEXTVAL from dual";
PreparedStatement pst = conn.prepareStatement(sqlIdentifier);
synchronized( this ) {
   ResultSet rs = pst.executeQuery();
   if(rs.next())
     long myId = rs.getLong(1);

之后,将其作为参数传递给preparedStatement。

...
String sqlInsert = "INSERT INTO TESTING VALUES(?, ?, ?)";
PreparedStatement pst = conn.prepareStaetment(sqlInsert);
pst.setLong(1, myId);
...

从那时起,您将始终拥有您的序列号。

这些不是功能性示例(没有catch或finally等),但会给您一个如何做到的想法;)


1
可能有一种方法可以通过使用“returning into”语法来避免额外的“select”。 - Jon Heller
1
当然,但我提供了一个通用的方法,使用Oracle语法作为实际示例。RETURN INTO在SQL Server中不起作用,因为您必须使用存储过程来执行相同的操作,并使用CallableStatement注册输出参数。对于DB2,您只需执行SELECT到SYSIBM.SYSDUMMY1等等... - Cristian Meneses

4
在Spring和Oracle数据库中,这应该可以工作。
public Long getSequence() {
  org.springframework.jdbc.core.JdbcTemplate jdbcTemplateObject = new JdbcTemplate(dataSource);
  Long seq;
  String sql = "select SEQ_XY.NEXTVAL from dual";
  seq = jdbcTemplateObject.queryForObject(sql, new Object[] {}, Long.class);
  return seq;
}

1

请按照以下步骤进行:

                 1) create sequence in database by using the following query.
CREATE SEQUENCE sequence_name
[START WITH start_num]
[INCREMENT BY increment_num]
[ { MAXVALUE maximum_num | NOMAXVALUE } ]
[ { MINVALUE minimum_num | NOMINVALUE } ]
[ { CYCLE | NOCYCLE } ]
[ { CACHE cache_num | NOCACHE } ]
[ { ORDER | NOORDER } ];

例子:

CREATE SEQUENCE customers_seq
 START WITH     1000
 INCREMENT BY   1
 NOCACHE
 NOCYCLE;

2) 检查序列是否已成功创建。 通过执行以下命令:

                       select * from user_sequences;

检查名称为 "customers_seq" 的内容

3) 运行查询:

示例程序:

Statement stmt= connection.createStatement();

ResultSet rs = stmt.executeQuery("SELECT customers_seq.NEXTVAL FROM dual");

if ( rs!=null && rs.next() ) {
 int cust_id = rs.getInt(1);
sysout(cust_id);
rs.close();
}

stmt.close(); 
con.close();

0

在Oracle中,您可以使用

long myId = rs.getLong("NEXTVAL");

这将在HSQL中失败。 您可以通过添加"as NEXTVAL"来修改sql语句。

String sqlIdentifier = "select TESTING_SEQ.NEXTVAL as NEXTVAL from dual";

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