乙個用來生成流水號的儲存過程

2021-03-31 16:28:09 字數 2629 閱讀 8779

我們經常需要用乙個流水號來唯一表示一條資料,我們有時採用佇列來自動生成乙個唯一的流水號,但是採用佇列經常不能滿足我們的需求,比如說,這個佇列只能設定乙個最小值,最大值,然後進行累加,不能將產生這個流水號的日期包括今這個流水號中;一種型別就要新建乙個佇列等。

下面這個儲存過程可以產生乙個流水號,它的格式是當前日期(格式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...