-- 准备
create or replace
package myseq
is
function nextv(in_id number) return number
;
end;
/
create or replace
package body myseq
is
type seqtab_type is table of integer index by pls_integer;
seqs seqtab_type;
function nextv(in_id number) return number
is
begin
seqs(in_id) := seqs(in_id)+1; -- 优化
-- 或者
-- select nvl(max(id),0)+1 into seqs(in_id)
-- from test
-- where docid = in_id;
return seqs(in_id);
exception
when no_data_found then
-- seqs(in_id) := 1;
-- 或者
select nvl(max(id),0)+1 into seqs(in_id)
from test
where docid = in_id;
return seqs(in_id);
when others then
raise;
end
;
end;
/
-- 执行
insert into test (id,docid,name) values (myseq.nextv(1),1,'sfsdf');
insert into test (id,docid,name) values (myseq.nextv(1),1,'sfsdf');
insert into test (id,docid,name) values (myseq.nextv(1),1,'sfsdf');
insert into test (id,docid,name) values (myseq.nextv(1),1,'sfsdf');
insert into test (id,docid,name) values (myseq.nextv(2),2,'sfsdf');
insert into test (id,docid,name) values (myseq.nextv(2),2,'sfsdf');
insert into test (id,docid,name) values (myseq.nextv(2),2,'sfsdf');
insert into test (id,docid,name) values (myseq.nextv(2),2,'sfsdf');
insert into test (id,docid,name) values (myseq.nextv(2),2,'sfsdf');
column name format a10
select * from test;
ID DOCID NAME
---------- ---------- ----------
1 1 sfsdf
2 1 sfsdf
3 1 sfsdf
4 1 sfsdf
1 2 sfsdf
2 2 sfsdf
3 2 sfsdf
4 2 sfsdf
5 2 sfsdf