在Oracle中选择IDENT_CURRENT('tablename')

时间:2010-09-07 09:54:02

标签: sql oracle plsql uniqueidentifier

我是PL / SQL的新手,我需要在insert语句之后在数据表中插入最后一个id。

类似于MS SQL SELECT IDENT_CURRENT('tablename')

4 个答案:

答案 0 :(得分:8)

您可以使用RETURNING子句:

insert into mytable(x,y) values (1,2) returning id into v_id;

当有一个填充id列的触发器时,这很有效,所以你不需要“从双重选择seq.currval”。

答案 1 :(得分:4)

Oracle中没有内置的自动增量字段,您可以使用序列创建它:

CREATE TABLE some_tab(
      rec_id      INTEGER,
      some_data   VARCHAR2(300)
);

CREATE SEQUENCE some_tab_seq;

CREATE OR REPLACE TRIGGER trig_BI
   BEFORE INSERT
   ON some_tab
   FOR EACH ROW
BEGIN
   IF :NEW.rec_id IS NULL
   THEN
      :NEW.rec_id := some_tab_seq.NEXTVAL ;
   END IF;
END;

然后在PL / SQL中,您可以通过

获取序列的当前值

your_var := some_tab_seq.CURRVAL

同样在旧版本的Oracle中,您无法直接将NEXTVAL / CURRVAL读入var并且必须这样做:

SELECT some_tab_seq.CURRVAL
  INTO your_var
  FROM DUAL;

答案 2 :(得分:2)

Oracle不实现标识列。它使用Sequences生成唯一的数字,可以在任何表中用作PK值。

因此表达式IDENT_CURRENT('my_table')最好转换为表格PK的序列的MySequence.CURRVAL。

通常,您可以通过以下方式检索MS SQL中插入的PK值:

INSERT INTO MyTable ...
SELECT @PK = SCOPE_IDENTITY()

在Oracle中,使用INSERT RETURNING子句来实现类似的功能

DECLARE PK ...;
INSERT INTO MyTable
RETURNING TableID INTO PK;

答案 3 :(得分:1)

如果您使用的是Oracle 12c IDENTITY列(如我在this blog post或其他Stack Overflow answer中提到的那样),则可以使用以下命令获取架构的所有当前标识值单个查询:

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

显然可以为table_name过滤此查询,或者您直接在上面直接重用了current_value()函数的内容。