Oracle
 sql >> Base de données >  >> RDS >> Oracle

Insertion dans Oracle et récupération de l'ID de séquence généré

En développant un peu les réponses de @Guru et @Ronnis, vous pouvez masquer la séquence et la faire ressembler davantage à une incrémentation automatique à l'aide d'un déclencheur, et avoir une procédure qui fait l'insertion pour vous et renvoie l'ID généré comme sortie paramètre.

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

Vous pouvez alors appeler la procédure au lieu de faire une simple insertion, par ex. depuis un bloc anonyme :

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

Vous pouvez passer l'appel sans blocage anonyme explicite, par ex. depuis SQL*Plus :

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

... et utilisez la variable de liaison :l_batchid pour se référer à la valeur générée par la suite :

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