java在插入之前获取SQL下一个记录的序列号

Posted

技术标签:

【中文标题】java在插入之前获取SQL下一个记录的序列号【英文标题】:java getting SQL next sequence number of the record before insertion 【发布时间】:2013-08-02 20:48:51 【问题描述】:

我的 java 代码中有 TestingID 变量和一个 sql 字符串,如下所示。 sql 字符串稍后将用于prepareStatement

 int TestingID; 

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

 MethodA(TestingID);     //passing TestingID to MethodA

我需要将新插入的记录的下一个序列值获取到TestingID中,这样我就可以在上面显示的另一种方法中使用它。

【问题讨论】:

【参考方案1】:

通过使用这种方法,您应该首先查询新的身份值(我看到您正在使用序列)。这可以通过发出一个选择来完成。

// 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 等),但会让您了解如何做;)

【讨论】:

可能有一种方法可以通过使用returning into 语法来避免额外的select 当然,但我提供了一个使用 oracle 语法的通用方法作为一个实际示例。 RETURN INTO 不适用于 SQL Server,因为您必须使用存储过程来执行相同的操作,并使用 CallableStatement 来注册 out 参数。对于 DB2,您可以只对 SYSIBM.SYSDUMMY1 执行 SELECT,等等...【参考方案2】:

在 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;

【讨论】:

【参考方案3】:

在Oracle中你可以使用

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

这对于 HSQL 将失败。 可以修改sql语句,添加“as NEXTVAL”。

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

【讨论】:

【参考方案4】:

按照以下步骤操作:

                 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();

【讨论】:

以上是关于java在插入之前获取SQL下一个记录的序列号的主要内容,如果未能解决你的问题,请参考以下文章

Java常见排序算法——直接插入排序

插入排序

Oracle中获取连续的序列号范围的SQL

Oracle怎么得到刚刚新插入数据库那条记录的id

插入排序

插入排序