在同一语句中获取插入的id

9 java database oracle jdbc

有没有办法在一个表中插入一行并获得新生成的ID,只在一个语句中?我想使用JDBC,ID将由序列生成,或者是自动增量字段.

谢谢你的帮助.

约翰波兰克雷

dfa*_*dfa 10

使用getGeneratedKeys():

resultSet = pstmt.getGeneratedKeys(); 

if (resultSet != null && resultSet.next()) { 
    lastId = resultSet.getInt(1); 
}
Run Code Online (Sandbox Code Playgroud)


Vin*_*rat 6

您可以使用该RETURNING子句获取已更新或插入的任何列的值.它适用于触发器(即:您获得在执行触发器后实际插入的值).考虑:

SQL> CREATE TABLE a (ID NUMBER PRIMARY KEY);

Table created
SQL> CREATE SEQUENCE a_seq;

Sequence created
SQL> VARIABLE x NUMBER;
SQL> BEGIN
  2     INSERT INTO a VALUES (a_seq.nextval) RETURNING ID INTO :x;
  3  END;
  4  /

PL/SQL procedure successfully completed
x
---------
1

SQL> /

PL/SQL procedure successfully completed
x
---------
2
Run Code Online (Sandbox Code Playgroud)


Bil*_*win 0

自动生成的 ID 的值直到执行 INSERT 后才知道,因为其他语句可能同时执行,并且 RDBMS 需要决定如何安排哪个语句先执行。

您在 INSERT 语句中的表达式中调用的任何函数都必须在插入新行之前进行计算,因此它无法知道生成了什么 ID 值。

我可以想到两个接近您所要求的选项:

  • 编写一个在 INSERT 之后运行的触发器,以便您可以访问生成的 ID 键值。

  • 编写一个过程来包装插入,以便您可以执行过程中的其他代码并查询最后生成的 ID。

但是,我怀疑您真正要问的是,即使其他会话也在插入行并生成自己的 ID 值,您是否可以查询当前会话最后生成的 ID 值。您可以放心,每个提供自动增量功能的 RDBMS 都提供了一种查询该值的方法,并且它会告诉您当前会话范围内生成的最后一个 ID。这不受其他会话中完成的插入的影响。