sql – 插入Oracle并检索生成的序列ID

我有一些SQL Server的原始SQL查询,使用SCOPE_IDENTITY来检索特定INSERT的生成的ID,之后该INSERT发生在一个执行中…

INSERT into Batch(
BatchName,
BatchType,
Source,
Area
) Values (
@strBatchName,
@strType,
@strSource,
@intArea
);

SELECT SCOPE_IDENTITY() BatchID;

问题是:

对于Oracle数据库,最好的方法是什么?

这可以通过标准SQL在Oracle上完成,还是必须将其切换为使用存储过程并在存储过程的正文中放置类似的东西?

如果它必须是存储过程,那么用于检索最后生成的序列号的事实上的标准方法是什么,注意考虑在多个线程上可能会出现重叠执行,因此这种机制将需要检索正确生成的ID和不一定是最后生成的绝对ID。

如果两个同时执行,则每个必须从每个相应的呼叫返回正确的生成的ID。注意我没有使用SQL Server的“@@ IDENTITY”,因为调用的多线程性质。

如果可能,我宁愿保持原始的SQL,因为我可以更容易地跨平台进行管理(包含由DBMS识别标签分隔的每个平台的SQL块的单个文件)。存储的过程对我来说有更多的工作要管理,但如果这是唯一可行的方法,我可以这样做。

在@Guru和@Ronnis的答案上扩展一点,您可以隐藏序列,使其看起来更像使用触发器的自动增量,并且具有为您插入的过程,并将生成的ID作为输出返回参数。

create table batch(batchid number,
    batchname varchar2(30),
    batchtype char(1),
    source char(1),
    intarea number)
/

create sequence batch_seq start with 1
/

create trigger batch_bi
before insert on batch
for each row
begin
    select batch_seq.nextval into :new.batchid from dual;
end;
/

create procedure insert_batch(v_batchname batch.batchname%TYPE,
    v_batchtype batch.batchtype%TYPE,
    v_source batch.source%TYPE,
    v_intarea batch.intarea%TYPE,
    v_batchid out batch.batchid%TYPE)
as
begin
    insert into batch(batchname, batchtype, source, intarea)
    values(v_batchname, v_batchtype, v_source, v_intarea)
    returning batchid into v_batchid;
end;
/

然后,您可以调用该过程,而不是做一个简单的插入,例如。从一个巨大的块:

declare
    l_batchid batch.batchid%TYPE;
begin
    insert_batch(v_batchname => 'Batch 1',
        v_batchtype => 'A',
        v_source => 'Z',
        v_intarea => 1,
        v_batchid => l_batchid);
    dbms_output.put_line('Generated id: ' || l_batchid);

    insert_batch(v_batchname => 'Batch 99',
        v_batchtype => 'B',
        v_source => 'Y',
        v_intarea => 9,
        v_batchid => l_batchid);
    dbms_output.put_line('Generated id: ' || l_batchid);
end;
/

Generated id: 1
Generated id: 2

您可以拨打电话而没有明确的匿名阻止,例如从SQL * Plus:

variable l_batchid number;
exec insert_batch('Batch 21', 'C', 'X', 7, :l_batchid);

…并使用绑定变量:l_batchid以后引用生成的值:

print l_batchid;
insert into some_table values(:l_batch_id, ...);
翻译自:https://stackoverflow.com/questions/5558979/inserting-into-oracle-and-retrieving-the-generated-sequence-id

转载注明原文:sql – 插入Oracle并检索生成的序列ID