用mysql的存储过程实现生成唯一订单号
2015-03-02 16:07
323 查看
DELIMITER $$ USE `roamerbuddy`$$ DROP PROCEDURE IF EXISTS `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 orderNum INT DEFAULT 5; -- 订单变化的值 -- 异常处理 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 ; IF TRUE -- 如果true插入一条数据 THEN INSERT INTO generate_serialno (id, ordervalue, ordertime) VALUES (1, 1, currentTime) ; END IF ; -- 否则更改订单号 UPDATE generate_serialno obj SET obj.ordervalue = CASE -- 订单变化的值如果今天大于昨天从1开始,否则再原来的基础上加1 WHEN TO_DAYS(currentTime) > TO_DAYS(obj.ordertime) THEN 1 ELSE orderNameValue + 1 END, obj.ordertime = currentTime WHERE ( -- 订单变化的值 obj.id = 1 AND obj.ordervalue = orderNameValue ) ; SET updateRow = ROW_COUNT() ; WHILE ! updateRow = 1 DO -- 如果更改的行数不等于1 SELECT -- 获得当前的订单变化值 IFNULL(gs.ordervalue, 0) INTO orderNameValue FROM generate_serialno gs WHERE id = 1 ; UPDATE generate_serialno obj SET obj.ordervalue = CASE WHEN TO_DAYS(currentTime) > TO_DAYS(obj.ordertime) THEN 1 ELSE orderNameValue + 1 END, obj.ordertime = currentTime WHERE (-- 只有订单变化值和id都相等的情况下才能更改,更具行锁的机制 obj.id = 1 AND obj.ordervalue = orderNameValue -- 注意!!!! ) ; SET updateRow = ROW_COUNT() ; END WHILE ; IF num = 8 THEN -- 根据年月日生成订单编号,订单编号形式:前缀+年月日+流水号,如:SH2013011000002 SELECT CONCAT( orderNamePre, DATE_FORMAT(currentTime, '%Y%m%d'), LPAD(orderNameValue, orderNum, '0') ) INTO orderCode ; ELSEIF num = 14 THEN -- 根据年月日时分秒生成订单编号,订单编号形式:前缀+年月日时分秒+流水号,如:SH2013011010050700001,个人不推荐使用这种方法生成流水号 SELECT CONCAT( orderNamePre, DATE_FORMAT(currentTime, '%Y%m%d%H%i%s'), LPAD(orderNameValue, orderNum, '0') ) INTO orderCode ; ELSE -- 根据年月日时分生成订单编号,订单形式:前缀+年月日时分+流水号,如:SH20130110100900005 SELECT CONCAT( orderNamePre, DATE_FORMAT(currentTime, '%Y%m%d%H%i'), LPAD(orderNameValue, orderNum, '0') ) INTO orderCode ; END IF ; SELECT orderCode ; END$$ DELIMITER ;
相关文章推荐
- MySql 运用存储过程实现主键生成
- mysql存储过程生成订单号
- 通过存储过程解决并发生成唯一订单号
- PHP调用MySQL的存储过程的实现代码
- PHP调用MySQL的存储过程的实现代码
- 生成唯一编号(序列号)--sql存储过程
- ASP.NET 生成唯一不重复的订单号 支持多用户并发、持多数据库的实现参考
- Java实现mysql存储过程调用
- MySQL存储过程和触发器的实现--数据库学习笔记
- 一个项目要实现和Windows日志交互,需要在Northwind数据库里面生成如下存储过程的脚本!
- phpMyAdmin调用和生成MySQL的存储过程以及CURSOR的应用
- MySQL 存储过程传参数问题:实现 where id in(1,2,3,...)
- MySQL 存储过程调用 返回结果集 实现分页
- 使用游标实现 mysql 存储过程中的循环
- mysql 生成完整的存储过程定义语句
- MySQL 存储过程传参数实现where id in(1,2,3,...)示例
- 如何在MySQL的存储过程中实现把过程参数用在游标定义的SELECT命令里面作为表名引用
- Mysql存储过程快速生成0000-9999号码
- mysql 存储过程实例 (日期以小时递增 while loop循环嵌套 随机数生成)
- MySQL 存储过程传参数实现where id in('40288c81494f088601494f92938d0002,40288c81494f088601494f92938d0012,')示例