@Guru और @Ronnis के उत्तरों पर थोड़ा विस्तार करते हुए, आप अनुक्रम को छिपा सकते हैं और इसे ट्रिगर का उपयोग करके एक ऑटो-इन्क्रीमेंट की तरह बना सकते हैं, और एक प्रक्रिया है जो आपके लिए सम्मिलित करती है और उत्पन्न आईडी को एक आउट के रूप में लौटाती है पैरामीटर।
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
आप एक स्पष्ट अनाम ब्लॉक के बिना कॉल कर सकते हैं, उदा। एसक्यूएल*प्लस से:
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, ...);