如何使用 SQL 命令从 oracle 数据库中获取最后一个 ID?

How to get last ID from oracle database using SQL command?

Oracle 12c 企业版中是否有使用SQL 命令获取最后插入的ID 的机制? 在 DB2 世界中,我会使用:

SELECT IDENTITY_VAL_LOCAL() AS IDENTITY FROM SYSIBM.SYSDUMMY1

这将使我获得当前连接(会话)中最后生成的 ID。这意味着无论其他用户(或同一用户但在不同会话中)是否发生其他插入,我都只会从当前会话中获取最新 ID。

我能找到的关于 Oracle 的唯一答案是使用匿名块的答案。

DECLARE
    V_ID NUMBER;
BEGIN
    INSERT INTO OBJECT_EXAMPLE(NAME) VALUES ('Some name') returning ID into V_ID;
    DBMS_OUTPUT.put_line(V_ID);
END;

但是,这不会 return 结果集。由于我使用的是 IBM BPM 产品,因此在执行匿名块时无法定义输出参数(我得到 "OUT parameters are only valid when used with a call operation")。另外,我无法像在 DBeaver 中那样获得 "output" 部分(我得到空记录)。

所以我真正需要的是:

具有自动分配的唯一整数列的 Oracle tables 使用 sequence 对象来生成这些唯一值。

查看 table 定义或您的 INSERT 查询。其中之一将向您显示唯一 ID 列的序列对象的名称。

然后使用序列,通过 sequence.nextval,为 INSERT 创建一个唯一的 id 到 table.

然后立即做SELECT sequence.currval FROM dual得到最新的值,在使用sequence分配一个唯一值之后。对于竞争条件安全的操作,请将 SELECT 放入带有 INSERT 的事务中。

这个序列的东西经常用在像这样的一系列 INSERT 操作中。

 INSERT INTO person (person_id, given, surname, title)
            VALUES  (personid.nextval, 'Larry', 'Ellison', 'boss');
 INSERT INTO phone  (phone_id, person_id, type, value)
            VALUES  (phoneid.nextval, personid.currval, 'home', '555-1212');
 INSERT INTO phone  (phone_id, person_id, type, value)
            VALUES  (phoneid.nextval, personid.currval, 'office', '555-3434');

这为我们提供了一个 person 行和两个关联的 phone 行。注意 phone 行都使用了 personid.currval