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

Database 如何使用SQL命令从oracle数据库中获取最后一个ID?,database,oracle,ibm-bpm,Database,Oracle,Ibm Bpm,在Oracle 12c Enterprise edition中,是否有使用SQL命令获取最后插入ID的机制? 在DB2世界中,我将使用: SELECT IDENTITY_VAL_LOCAL() AS IDENTITY FROM SYSIBM.SYSDUMMY1 这将从当前连接(会话)中获取最后生成的ID。这意味着,无论其他用户(或同一用户但在不同会话中)是否进行了其他插入,我都只能从当前会话中获取最新的ID 我能为Oracle找到的唯一答案是使用匿名块 DECLARE V_ID NUM

在Oracle 12c Enterprise edition中,是否有使用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;
但是,这不会返回结果集。由于我使用的是IBM BPM产品,所以在执行匿名块时无法定义输出参数(我得到“OUT参数仅在与调用操作一起使用时有效”)。而且,我不能像在DBeaver中那样获得“output”部分(我得到的是空记录)

所以我真正需要的是:

  • 可以在表中插入一行并从该表中获取最新ID(或从会话中生成的最新ID),但仅限于该打开的连接 或
  • 类似于select但也执行insert的操作

具有自动分配的唯一整数列的Oracle表使用
序列
对象生成这些唯一值

查看表定义或
INSERT
查询。其中一个将为唯一id列显示序列对象的名称

然后使用序列,通过
sequence.nextval
,创建一个唯一的id,将
插入表中

然后在使用序列分配唯一值之后,立即执行
从dual中选择sequence.currval以获取最新值。对于竞争条件安全操作,请将SELECT放在带有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

谢谢您的回复。我已经测试了这个解决方案,它是有效的。每个会话都为命名序列获取自己的最后一个插入ID。然而,这个解决方案要求我首先确定序列的名称,这意味着我必须为每个序列编写特定的查询(在我的例子中,为每个表)。还有更一般的解决方案吗?更一般的解决方案吗?也许有人知道。很抱歉,我在BPM中有表和列名。我可以使用:从SYS.USER_选项卡_列中选择DATA_DEFAULT,其中TABLE_NAME='OBJECT_EXAMPLE'和COLUMN_NAME='ID';要获取“用户”。“序列名称”。nexval。-->幸运的是,这是BPM中的字符串。我可以修剪序列名并编写SQL查询。只是为了完成解决方案。:)