我們經常需要用乙個流水號來唯一表示一條資料,我們有時採用佇列來自動生成乙個唯一的流水號,但是採用佇列經常不能滿足我們的需求,比如說,這個佇列只能設定乙個最小值,最大值,然後進行累加,不能將產生這個流水號的日期包括今這個流水號中;一種型別就要新建乙個佇列等。
下面這個儲存過程可以產生乙個流水號,它的格式是當前日期(格式yyyymmdd)+6位的流水號數字,不同的型別只要給出乙個不同的型別名稱就可以了。在使用這個儲存過程前,要先建立乙個表來儲存不同的型別,表結構如下:
create table t_genid
(class number(2) not null,
gendate char(8) not null,
id varchar2(12) not null
)tablespace service_main_dat
pctfree 10
pctused 80
initrans 1
maxtrans 255
storage
(initial 1m
next 1m
minextents 1
maxextents unlimited
pctincrease 0
);-- create/recreate primary, unique and foreign key constraints
alter table t_genid
add constraint pk_genid primary key (class,id)
using index
tablespace service_main_idx
pctfree 10
initrans 2
maxtrans 255
storage
(initial 1m
next 1m
minextents 1
maxextents unlimited
pctincrease 0
);儲存過程如下:
create or replace procedure p_getserialno
(i_type in varchar2, --流水號的型別
o_serialno out varchar2 --返回流水號
) is
v_dat varchar2(10);
v_serialnum number(7);
begin
--取系統日期生成需要的字串
v_dat := to_char(sysdate,('yyyymmdd'));
--生成產生流水號的序號
begin
select decode(gendate,v_dat,(id+1),1)
into v_serialnum
from t_genid where class=i_type for update;
exception
when no_data_found then
v_serialnum:= 1;
insert into t_genid(class,gendate,id)
values (i_type,v_dat,v_serialnum);
when too_many_rows then
select nvl(max(id)+1,1)
into v_serialnum
from t_genid where class=i_type;
delete t_agt_genid where class=i_type;
insert into t_genid(class,gendate,id)
values (i_type,v_dat,v_serialnum);
end;
--修改流水號引數
update t_genid
set gendate = v_dat,
id = v_serialnum where class=i_type;
***mit;
--得到需要的流水號
o_serialno := v_dat||lpad(v_serialnum,6,'0');
exception
when others then
o_serialno := null;
end;
/使用方法很簡單,就是在pl/sql中呼叫這個儲存過程,給其設定乙個型別就行了,如下:
create or replace procedure p_test()
isv_serid varchar2(14);
begin
p_agt_getserialno ('test',v_serid); --生成流水號,放到變數v_serid中,第乙個引數就是給其設定的型別了
insert int t_test (testid) values(v_serid);--將產生的流水號插入表中
***mit;
exception
when others then
rollback;
end;
/
乙個用來生成流水號的儲存過程
我們經常需要用乙個流水號來唯一表示一條資料,我們有時採用佇列來自動生成乙個唯一的流水號,但是採用佇列經常不能滿足我們的需求,比如說,這個佇列只能設定乙個最小值,最大值,然後進行累加,不能將產生這個流水號的日期包括今這個流水號中 一種型別就要新建乙個佇列等。下面這個儲存過程可以產生乙個流水號,它的格式...
儲存過程生成流水號
格式如a20110915001,第1位寫死a,2 5位為年,6 7位為月,8 9位為日,最後三位為流水號.declare newvalue varchar 12 declare newcode varchar 3 declare oldcode varchar 3 declare oldyearmo...
流水號工單號生成 儲存過程
1.生成格式 工單型別 日期 四位流水號 例如 1101 20100517 1104 儲存過程 create procedure dbo cs spcreateformkey asdeclare currentmaxid char 4 id char 4 begin set nocount on s...