自从 Oracle 12c 版本开始,我们可以使用 IDENTITY 字段。是否有一种方法可以检索最后插入的 identity 值(例如,select @@identity 或 select LAST_INSERTED_ID() 等)?
好的。在12c中,Oracle使用序列和默认值来实现IDENTITY功能。因此,您需要了解序列才能回答您的问题。
首先创建一个测试IDENTITY表。
CREATE TABLE IDENTITY_TEST_TABLE
(
ID NUMBER GENERATED ALWAYS AS IDENTITY
, NAME VARCHAR2(30 BYTE)
);
首先,让我们找到使用该标识列创建的序列名称。这个序列名称是您表中的默认值。
Select TABLE_NAME, COLUMN_NAME, DATA_DEFAULT from USER_TAB_COLUMNS
where TABLE_NAME = 'IDENTITY_TEST_TABLE';
对我来说,这个值是"ISEQ$$_193606"
插入一些值。
INSERT INTO IDENTITY_TEST_TABLE (name) VALUES ('atilla');
INSERT INTO IDENTITY_TEST_TABLE (name) VALUES ('aydın');
然后插入数值并查找身份。
INSERT INTO IDENTITY_TEST_TABLE (name) VALUES ('atilla');
SELECT "ISEQ$$_193606".currval from dual;
您应该看到您的身份值。如果想在一个块中执行,请使用
declare
s2 number;
begin
INSERT INTO IDENTITY_TEST_TABLE (name) VALUES ('atilla') returning ID into s2;
dbms_output.put_line(s2);
end;
最后一个ID是我的身份列名称。
<sequence_name>.currval
。 - Bencurrval
功能 - 尚未在实际生活中使用它们:(。 - APCIDENTITY
列在“幕后”使用SEQUENCE
- 自动创建和删除与其使用的表相应的序列。此外,您可以使用start with 1000 and increment by 2指定起始值和增量参数。当您不想直接操作其值时,使用IDENTITY
非常方便。
但是,如果您需要直接操作序列,则应使用Oracle 12c中提供的另一种选项 - 列默认值。这些默认值可以从序列nextval
或currval
生成。这使您可以拥有一个可理解的序列名称,并将其用作“标识”,而无需触发器。
create table my_new_table
(id number default my_new_table_seq.nextval not null)
my_new_table_seq.currval
。RETURNING
子句在插入语句中获取从SEQUENCE
生成的ID。create global temporary table local_identity_storage ("id" number) on commit delete rows
在临时表中插入保存这个值:
CREATE TABLE identity_test_table (
id_ident NUMBER GENERATED BY DEFAULT AS IDENTITY,
same_value VARCHAR2(100)
);
declare
v_id number(10, 0);
begin
INSERT INTO identity_test_table
(same_value)
VALUES
('Test value')
RETURNING id_ident INTO v_id;
insert into local_identity_storage ("id") values (v_id);
commit;
end;
select "id" from local_identity_storage
INSERT INTO yourtable (....)
VALUES (...)
RETURNING pk_id INTO yourtable;
这将帮助您检索最后插入的行
如我在这篇博客文章中所写,你可以通过一次查询获取模式的所有当前标识值:
with
function current_value(p_table_name varchar2) return number is
v_current number;
begin
for rec in (
select sequence_name
from user_tab_identity_cols
where table_name = p_table_name
)
loop
execute immediate 'select ' || rec.sequence_name || '.currval from dual'
into v_current;
return v_current;
end loop;
return null;
end;
select *
from (
select table_name, current_value(table_name) current_value
from user_tables
)
where current_value is not null
order by table_name;
/
SELECT mytable_seq.nextval MyTableID FROM DUAL
https://www.sitepoint.com/community/t/oracle-last-insert-id-question/1402
如果需要,可以在事务中封装您的插入和查询操作。
FROM Dual
子句。 - bubi最后插入的将会是该列的最高值。 所以我认为最简单的方法是使用max()函数。 像这样
select max(id) from table_name
sequence.currval
来获取最后生成的值。 - user330315