擴展了@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, ...);
這些是一些很好的答案。現在我正在完成任務,它看起來像另一個使用「包」的圖層,將遊標設置爲「ROWTYPE」,並通過包內的過程或函數*返回一些數據將成爲最後一步以結果集的形式返回數據,以便調用者可以執行SELECT,但將需要插入的數據作爲參數傳遞給包函數。新的,所以希望這一切都有道理。 – Allbite 2011-05-09 21:38:32