如何使用 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" 部分(我得到空记录)。
所以我真正需要的是:
- 可以在 table 中插入一行并获取 table 的最新 ID 形式(或从会话中最新生成的 ID)但仅限于打开的连接
或
- 类似于 select 但也执行插入操作的东西
具有自动分配的唯一整数列的 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
。
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" 部分(我得到空记录)。
所以我真正需要的是:
- 可以在 table 中插入一行并获取 table 的最新 ID 形式(或从会话中最新生成的 ID)但仅限于打开的连接 或
- 类似于 select 但也执行插入操作的东西
具有自动分配的唯一整数列的 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
。