检索Oracle上次插入的IDENTITY

时间:2016-01-15 12:38:28

标签: sql oracle

从Oracle 12c开始,我们可以使用IDENTITY字段。

有没有办法检索最后插入的身份(例如select @@identityselect LAST_INSERTED_ID()等等)?

7 个答案:

答案 0 :(得分:10)

好。 Oracle在12c中使用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是我的标识列名称。

答案 1 :(得分:1)

IDENTITY列使用了SEQUENCE“引擎盖” - 使用它所使用的表自动创建和删除序列。 此外,您可以使用指定start with和increment参数 从1000开始并以2递增。当您不想直接操作它时,使用IDENTITY非常方便。

但如果你需要以某种方式直接操作序列,你应该使用 Oracle 12c中提供的另一个选项 - 列默认值。 Sutch默认 值可以从序列nextvalcurrval生成。允许您拥有一个易于理解的序列名称,并将其用作" identity"没有触发器。

create table my_new_table
(id number default my_new_table_seq.nextval not null)

您将始终可以致电:my_new_table_seq.currval

可以使用SEQUENCE子句从插入语句中获取RETURNING生成的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;

现在你有了#34;本地"插入ID。

select "id" from local_identity_storage

答案 2 :(得分:1)

似乎Oracle实施IDENTITY只是为了说它们支持身份。所有内容仍然使用SEQUENCES实现,有时您需要访问SEQUENCE才能完成部分工作(即检索最新插入的IDENTITY)。

无法检索类似于MySQL,SQL Server,DB2等的IDENTITY,您必须使用SEQUENCE检索它。

答案 3 :(得分:1)

请检查

INSERT INTO yourtable (....)
  VALUES (...)
  RETURNING pk_id INTO yourtable;

它可以帮助您检索最后插入的行

答案 4 :(得分:0)

您的范围,全局或上次用户是什么? 如果全球只使用

SELECT mytable_seq.nextval MyTableID FROM DUAL

https://www.sitepoint.com/community/t/oracle-last-insert-id-question/1402

如果具体封装您的插页&在交易中查询。

答案 5 :(得分:0)

正如我在this blog post中所写的那样,您可以通过一个查询来获取模式的所有当前标识值:

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;
/

答案 6 :(得分:-1)

最后一次插入将是该列的最高值。 所以我认为最简单的方法是使用 max() 方法。 像这样

select max(id) from table_name