Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Einfügen in Oracle und Abrufen der generierten Sequenz-ID

Wenn Sie die Antworten von @Guru und @Ronnis ein wenig erweitern, können Sie die Sequenz ausblenden und mithilfe eines Triggers eher wie ein automatisches Inkrement aussehen lassen und über eine Prozedur verfügen, die das Einfügen für Sie durchführt und die generierte ID als out zurückgibt Parameter.

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

Sie können dann die Prozedur aufrufen, anstatt eine einfache Einfügung durchzuführen, z. aus einem anonymen Block:

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

Sie können den Anruf ohne explizite anonyme Sperre tätigen, z. von SQL*Plus:

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

... und verwenden Sie die Bind-Variable :l_batchid um anschließend auf den generierten Wert zu verweisen:

print l_batchid;
insert into some_table values(:l_batch_id, ...);