我是PL / SQL的新手,我需要在insert语句之后在数据表中插入最后一个id。
类似于MS SQL SELECT IDENT_CURRENT('tablename')
答案 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()
函数的内容。