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下一个记录的序列号的主要内容,如果未能解决你的问题,请参考以下文章