mysql 生成流水訂單號 存儲過程 訂單編號
測試訂單表(test_orders):
- CREATE TABLE 'test_orders'(
- 'id' int(11) NOT NULL AUTO_INCREMENT,
- 'orderNo' varchar(25) NOT NULL DEFAULT '',
- 'orderName' char(10) NOT NULL DEFAULT '',
- PRIMARY KEY ('id'),
- ) ENGINE=InnoDB AUTO_INCREMENT=76 DEFAULT CHARSET=utf8
生成訂單編號的存儲過程(generate_orderNo):
BEGIN
DECLARE currentDate varCHAR (15) ;-- 當前日期,有可能包含時分秒
DECLARE maxNo INT DEFAULT 0 ; -- 離現在最近的滿足條件的訂單編號的流水號最后5位,如:SH2013011000002的maxNo=2
-- DECLARE l_orderNo varCHAR (25) ;-- 新生成的訂單編號
-- DECLARE oldDate DATE ;-- 離現在最近的滿足條件的訂單編號的日期
DECLARE oldOrderNo VARCHAR (25) DEFAULT '' ;-- 離現在最近的滿足條件的訂單編號
if num = 8 then -- 根據年月日生成訂單編號
SELECT DATE_FORMAT(NOW(), '%Y%m%d') INTO currentDate ;-- 訂單編號形式:前綴+年月日+流水號,如:SH2013011000002
elseif num = 14 then -- 根據年月日時分秒生成訂單編號
SELECT DATE_FORMAT(NOW(), '%Y%m%d%H%i%s') INTO currentDate ; -- 訂單編號形式:前綴+年月日時分秒+流水號,如:SH2013011010050700001,個人不推薦使用這種方法生成流水號
else -- 根據年月日時分生成訂單編號
SELECT DATE_FORMAT(NOW(), '%Y%m%d%H%i') INTO currentDate ;-- 訂單形式:前綴+年月日時分+流水號,如:SH20130110100900005
end if ;
SELECT IFNULL(orderNo, '') INTO oldOrderNo
FROM tb_orderids
WHERE SUBSTRING(orderNo, 3, num) = currentDate
AND SUBSTRING(orderNo, 1, 2) = orderNamePre
and length(orderNo) = 7 + num
ORDER BY id DESC LIMIT 1 ; -- 有多條時只顯示離現在最近的一條
IF oldOrderNo != '' THEN
SET maxNo = CONVERT(SUBSTRING(oldOrderNo, -5), DECIMAL) ;-- SUBSTRING(oldOrderNo, -5):訂單編號如果不為‘‘截取訂單的最后5位
END IF ;
SELECT
CONCAT(orderNamePre, currentDate, LPAD((maxNo + 1), 5, '0')) INTO newOrderNo ; -- LPAD((maxNo + 1), 5, '0'):如果不足5位,將用0填充左邊
INSERT INTO tb_orderids (orderNo, orderName) VALUES (newOrderNo, 'testNo') ; -- 向訂單表中插入數據
-- set newOrderNo = l_orderNo;
SELECT
newOrderNo ;
END
java調用過程
public String generate_orderNo() {
CallableStatement cs = null;
Connection conn = null;
ResultSet rs = null;
try {
DataSource dataSource=TransactionManager.getSource();
conn = dataSource.getConnection();
cs = conn.prepareCall("{call generate_orderNo(?,?,?) }");
// 設置輸入參數
cs.setInt(2, 12);//(2, 12);
cs.registerOutParameter(3, Types.VARCHAR);
cs.execute();
// 設置輸出參數
String OrderID = cs.getString(3);
return OrderID;
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("生成訂單號失敗");
}