delimiter $$use`roamerbuddy`$$
drop
procedure
ifexists
`generate_orderno`$$
create definer=`root`@`%` procedure
`generate_orderno`(
in ordernamepre char(4
),
in num int
, out neworderno
varchar (25))
begin
--訂單變化的值
declare ordernamevalue int;
--更新行數
declare updaterow int;
--當前日期,有可能包含時分秒
declare currenttime datetime;
--訂單號
declare ordercode varchar (64
) ;
--異常處理
declare
continue handler for
1062
set currenttime =
now() ;
select
ifnull(gs.ordervalue,
0) into
ordernamevalue
from
generate_serialno gs
where id =1;
set currenttime =
now() ;
--開啟自動提交
set autocommit =1;
iftrue
then
insert
into
generate_serialno (id, ordervalue, ordertime)
values
(1, 1
, currenttime) ;
endif;
update
generate_serialno obj
setobj.ordervalue
=case
when to_days(currenttime) >
to_days(obj.ordertime)
then
1else ordernamevalue +
1end
, obj.ordertime
=currenttime
where
( obj.id =1
and obj.ordervalue =
ordernamevalue
) ;set updaterow =
row_count() ;
while
! updaterow
=1 do --
獲得當前的訂單和變化的值
select
ifnull(gs.ordervalue,
0) into
ordernamevalue
from
generate_serialno gs
where id =1;
update
generate_serialno obj
setobj.ordervalue
=case
when to_days(currenttime) >
to_days(obj.ordertime)
then
1else ordernamevalue +
1end
, obj.ordertime
=currenttime
where
( obj.id =1
and obj.ordervalue =
ordernamevalue
) ;set updaterow =
row_count() ;
endwhile;
if num =
8then
--根據年月日生成訂單編號,訂單編號形式:字首+年月日+流水號,如:sh2013011000002
select
concat(
ordernamepre,
date_format(currenttime,
'%y%m%d'),
lpad(ordernamevalue, num, '0
'))
into
ordercode ;
elseif num =14
then
--根據年月日時分秒生成訂單編號,訂單編號形式:字首+年月日時分秒+流水號,如:sh2013011010050700001,個人不推薦使用這種方法生成流水號
select
concat(
ordernamepre,
date_format(currenttime,
'%y%m%d%h%i%s'),
lpad(ordernamevalue, num, '0
'))
into
ordercode ;
else
--根據年月日時分生成訂單編號,訂單形式:字首+年月日時分+流水號,如:sh20130110100900005
select
concat(
ordernamepre,
date_format(currenttime,
'%y%m%d%h%i'),
lpad(ordernamevalue, num, '0
'))
into
ordercode ;
endif;
select
ordercode ;
end$$
delimiter ;
droptable
ifexists
`generate_serialno`;
create
table
`generate_serialno` (
`id`
int(20) default
null
, `orderno`
varchar(50) default
null
, `orderpre`
varchar(30) default
null
, `ordervalue`
int(20) default
null
, `ordertime`
datetime
default
null
) engine
=innodb default charset=
utf8;
insert
into `generate_serialno` (`id`, `ordervalue`) values('
1','
1');
高並發生成唯一訂單號
最近開發一套會員系統,涉及到訂單號生成,在高並發條前提下,如何生成唯一的訂單號值得斟酌,我這裡提供一種較為可行的方案 public static string getorderidbyuuid 0 代表前面補充0 4 代表長度為4 d 代表引數為正數型 return time string.form...
SQL server高並發生成唯一訂單號的方法實現
前幾天寫了一篇mysql高並發生成唯一訂單號的方法,有人私信問有沒有sql server版本的,今天中午特地寫了sql server版本的高並發生成唯一訂單號實現,其實mysql和sql server原理都一樣,主要是他們部分語法有些區別,所以你會發現我這篇文章文字說明幾乎一樣,只有 和介面不一樣。...
MySQL高並發生成唯一訂單號的方法實現
這篇博文發布後,有朋友問有沒有sql server版本的,現在有了 傳送門 在乙個erp進銷存系統或0a等其他系統中,如果多人同時進行生成訂單號的操作的話,容易出現多人獲得同乙個訂單號的情況,對公司業務造成不可挽回的損失 我們可以利用儲存過程和資料表搭配,建立一張表和建立儲存過程,儲存過程負責生成訂...