sql >> Database >  >> RDS >> Oracle

Invoegen in Oracle en ophalen van de gegenereerde sequentie-ID

Als je de antwoorden van @Guru en @Ronnis een beetje uitbreidt, kun je de reeks verbergen en het meer op een automatische verhoging laten lijken met behulp van een trigger, en een procedure hebben die de invoeging voor je doet en de gegenereerde ID als een uit retourneert 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;
/

U kunt dan de procedure aanroepen in plaats van een gewone insertie te doen, b.v. van een anoniem blok:

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

U kunt de oproep plaatsen zonder een expliciete anonieme blokkering, b.v. van SQL*Plus:

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

... en gebruik de bindvariabele :l_batchid om achteraf naar de gegenereerde waarde te verwijzen:

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


  1. SQL gesplitste door komma's gescheiden rij

  2. Hoe SQLite Max() werkt

  3. Hoe een PostgreSQL-database verwijderen als er actieve verbindingen mee zijn?

  4. Conversie mislukt bij het converteren van datum en/of tijd van tekenreeks tijdens het invoegen van datetime