zoukankan      html  css  js  c++  java
  • 订单号---使用存储过程---查询一次. 就变化一次.保证不重复

    //01 cmd下线导入存储过程,

    DELIMITER $$

    USE `tripb`$$

    DROP PROCEDURE IF EXISTS `generate_orderNo`$$

    -- 这个是授权用户名.在任何ip上?

    CREATE DEFINER=`tripb`@`%` PROCEDURE `generate_orderNo`(IN orderNamePre CHAR(2), IN num INT, OUT newOrderNo VARCHAR(25))
    BEGIN
    DECLARE oldOrderNo VARCHAR (25) DEFAULT '' ;-- 离现在最近的满足条件的订单编号
    DECLARE currentDate VARCHAR (15) ;-- 当前日期,有可能包含时分秒
    DECLARE ordercurrentDate VARCHAR (15) ;-- 订单的当前日期,有可能包含时分秒
    DECLARE orderNameValue INT; -- 订单变化的值
    DECLARE orderNameNum INT DEFAULT 6; -- 订单变化的值

    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, ''),IFNULL(ordervalue+1,0),IFNULL(DATE_FORMAT(ordertime, '%Y%m%d'),'') INTO oldOrderNo,orderNameValue,ordercurrentDate
    FROM generate_serialno
    WHERE id=1 FOR UPDATE; -- 验证当天的时间

    -- 如果存在在原来的基础上加1,不存在从1开始
    IF oldOrderNo!=''&&ordercurrentDate=currentDate THEN -- 订单号不为空,并且 ,当前订单时间和当前时间相同,再原来基础上+1,否则新的一天从1开始
    SELECT CONCAT(orderNamePre, currentDate,LPAD(orderNameValue, orderNameNum, '0')) INTO newOrderNo ;
    ELSE
    SELECT CONCAT(orderNamePre, currentDate,LPAD(1, orderNameNum, '0')),1 INTO newOrderNo,orderNameValue;
    END IF;

    SET autocommit=0;-- 禁止自动提交
    -- 订单存在更改id为1的记录,不存在插入id为1的记录
    IF oldOrderNo!='' THEN
    UPDATE generate_serialno SET orderno=newOrderNo,orderpre=orderNamePre,ordertime=NOW(),ordervalue=orderNameValue WHERE id=1;
    ELSE
    INSERT INTO generate_serialno(id,orderno,orderpre,ordertime,ordervalue) VALUES(1,newOrderNo,orderNamePre,NOW(),1);
    END IF;
    COMMIT;-- 提交事务

    SELECT
    newOrderNo ;
    END$$

    DELIMITER ;

    DROP TABLE IF EXISTS `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;

    //03 每执行一下,查询一次. 就变化一次.保证不重复
    public function test(){

    $sql = "CALL `generate_orderNo`('Y', 8, @orderNo)";  // Y20160906000003
    $info = M()->query($sql);

    echo '<meta http-equiv="Content-type" content="text/html:charset=utf-8">';
    echo '<pre>';
    var_dump($info);

    }

  • 相关阅读:
    Nginx报400 Bad Request
    当前系统代理不是安全代理,是否信任
    nginx反向代理解决跨域问题
    SQL Prompt快捷键
    本地SQL Server怎么连接服务器上的数据库
    进制之间的转换
    计算机知识汇总
    C#语言学习记录
    excel常用技巧
    T-SQL学习记录
  • 原文地址:https://www.cnblogs.com/bj-tony/p/5846415.html
Copyright © 2011-2022 走看看