MySQL 存储过程和存储函数示例

    以下示例主要用于个人温习使用,因为长时间不谢存储过程或函数自己很容易忘记。

    其他记录

[sql]  view plain  copy
  1. CREATE DEFINER=`wpms_test`@`%` PROCEDURE `BookBusinessSerialNumber`(get_business_id varchar(40))  
  2. BEGIN  
  3.     #Routine body goes here...  
  4.     # 需求:传入服务商ID,返回当前日期的流水号,从1开始依次递增  
  5.       
  6.     # 获取当天日期  
  7.     DECLARE curentDate date;   
  8.     # 获取当前服务商的日期  
  9.     DECLARE businessDate date;  
  10.     # 获取当前服务商的流水号  
  11.     DECLARE serialOrder int(12);  
  12.     # 返回当前服务商的流水号  
  13.     DECLARE nowSerialOrder int(12);  
  14.   
  15.     SELECT curdate() INTO curentDate;  
  16.     SELECT a.ORDER_DATE, a.ORDER_COUNT INTO businessDate, serialOrder from PM_BOOK_BUSINESS_SERIALORDER a where a.BUSINESS_ID = `get_business_id`;  
  17.   
  18. #   SELECT curentDate, businessDate from dual;  
  19.     # 判断商户服务日期和当前日期是否相等  
  20.     IF(curentDate = businessDate) THEN        
  21.         #SELECT 1 from dual;  
  22.         set nowSerialOrder = serialOrder + 1;       # 得到后一个流水号  
  23.         UPDATE PM_BOOK_BUSINESS_SERIALORDER set ORDER_COUNT = `nowSerialOrder` WHERE BUSINESS_ID = `get_business_id`;  
  24.     ELSEIF(serialOrder is NULLTHEN   # 在表PM_BOOK_BUSINESS_SERIALORDER没有这个服务商信息  
  25.         #SELECT 2 from dual;  
  26.         set nowSerialOrder = 1;  
  27.         INSERT INTO PM_BOOK_BUSINESS_SERIALORDER(BUSINESS_ID, ORDER_DATE, ORDER_COUNT) VALUES(`get_business_id`, `curentDate`, `nowSerialOrder`);  
  28.     ELSE                                                                # 当天对应服务商生成一个新的流水号,从1开始  
  29.         #SELECT 3 from dual;  
  30.         set nowSerialOrder = 1;  
  31.         UPDATE PM_BOOK_BUSINESS_SERIALORDER set ORDER_COUNT = 1, ORDER_DATE = curentDate WHERE BUSINESS_ID = `get_business_id`;  
  32.     END IF;    
  33.   
  34.     SELECT nowSerialOrder;  
  35. #   SELECT curentDate, businessDate, serialOrder, nowSerialOrder, get_business_id;  
  36. END  



    存储函数

    1、ZhangFun1

[delphi]  view plain  copy
  1. CREATE DEFINER=`wpms_test`@`%` FUNCTION `ZhangFun1`(`orderId` varchar(50)) RETURNS int(11)  
  2. BEGIN  
  3.     #Routine body goes here...  
  4.     INSERT INTO Zhang_Test(ORDER_ID,PARTNER_ID,PUBLISH_ID,COUNT,PRICE,FREIGHT)  
  5.         VALUES(orderId, 'C1001','A1001',10,5000,500);  
  6.   
  7.     RETURN 0;  
  8. END  
    2、vefityGoodsLimit

[sql]  view plain  copy
  1. CREATE DEFINER=`wpms_test`@`%` FUNCTION `vefityGoodsLimit`(`publishId` varchar(50),`buyCount` int(11),`userId` varchar(50)) RETURNS varchar(200) CHARSET utf8  
  2. BEGIN  
  3.   
  4.   
  5.        DECLARE isLimit char(1);  
  6.        DECLARE buyLimit int(11);  
  7.        DECLARE usedBuyCount int(11);  
  8.          
  9.        DECLARE vefityStr varchar(200);  
  10.       
  11.          
  12.         ##获取商品的限购标识  
  13.         ##0不限购1限购  
  14.   
  15.        select P.IS_LIMIT,P.BUY_LIMIT INTO isLimit,buyLimit from PM_OTO_GOODS_PUBLISH P where P.PUBLISH_ID = publishId;  
  16.        #空值判断   
  17.        set isLimit = IFNULL(isLimit,'N');  
  18.         ##限购  
  19.         IF (isLimit = 'N'THEN  
  20.         set vefityStr = '不存在error';  
  21.         ELSEIF (isLimit = '1'THEN  
  22.          ##历史订单的商品数据获取  
  23.        select sum(OG.COUNTinto usedBuyCount from PM_OTO_ORDERS_GOODS OG ,PM_OTO_ORDERS_MASTER OM  
  24.         where OG.PUBLISH_ID = publishId and OM.ORDER_ID = OG.ORDER_ID   
  25.         and (OM.DEAL_STATE ='1' or OM.DEAL_STATE = '3'and OM.USER_ID = userId;  
  26.             
  27.           ##进行空值判断       
  28.           ##进行购买数量判断  
  29.           set usedBuyCount = IFNULL(usedBuyCount,0);  
  30.   
  31.           ##进行购买数量判断  
  32.           IF (buyLimit-usedBuyCount >= buyCount) THEN  
  33.              set vefityStr = '校验通过,状态OK';  
  34.           ELSE  
  35.            set vefityStr = '超过限购,请调整购物车error';  
  36.           END IF;  
  37.            
  38.         ELSE  
  39.         set vefityStr = '校验通过,状态OK';  
  40.         END IF;  
  41.    
  42.        RETURN vefityStr;  
  43.   
  44. END  


    存储过程

    1、ZhangT1

[sql]  view plain  copy
  1. CREATE DEFINER=`wpms_test`@`%` PROCEDURE `ZhangT1`()  
  2. BEGIN  
  3.     #Routine body goes here...  
  4.     #需求:查询表PM_PREPARE_BATCHID中IS_USED为0的BATCH_ID。如果不满足条件则创建一条新数据  
  5.     -- 定义结束标记  
  6.     DECLARE done INT DEFAULT 0;  
  7.     -- 定义变量  
  8.     DECLARE getBatchId VARCHAR(40);  
  9.     -- 定义游标  
  10.     DECLARE batchId CURSOR FOR SELECT BATCH_ID FROM PM_PREPARE_BATCHID WHERE IS_USED = '0';  
  11.       
  12.     -- 将结束标志绑定到游标  
  13.   DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;  
  14.   
  15.   
  16.   
  17.     -- 打开游标  
  18.     OPEN batchId;  
  19.         -- 开始循环  
  20.         read_loop:LOOP  
  21.             -- 提取游标中的数据  
  22.             FETCH batchId INTO getBatchId;  
  23. #SELECT batchId;  
  24.             -- 退出循环条件  
  25.             IF done THEN  
  26.                 LEAVE read_loop;  
  27.             END IF;  
  28.   
  29.         -- 结束循环  
  30.         END LOOP read_loop;  
  31.     -- 关闭游标  
  32.     CLOSE batchId;  
  33. END  
    2、ZhangT2

[sql]  view plain  copy
  1. CREATE DEFINER=`wpms_test`@`%` PROCEDURE `ZhangT2`(IN `orderId` varchar(50))  
  2. BEGIN  
  3.     #Routine body goes here...  
  4.     INSERT INTO Zhang_Test(ORDER_ID,PARTNER_ID,PUBLISH_ID,COUNT,PRICE,FREIGHT)  
  5.         VALUES(orderId, 'C1001','A1001',10,5000,500);  
  6. END  
    3、ZhangT3

[sql]  view plain  copy
  1. CREATE DEFINER=`wpms_test`@`%` PROCEDURE `ZhangT3`(IN partner varchar(40), OUT batch varchar(40))  
  2. BEGIN  
  3.     #Routine body goes here...  
  4. #DECLARE id VARCHAR(40) partnerId;  
  5. #Routine body goes here...  
  6.     #需求:查询PM_PREPARE_BATCHID 中店铺ID和IS_USED为0的BATCH_ID信息。【如果没有则新建一条数据】  
  7.     #返回批次号  
  8.     -- 定义结束标记    
  9.     DECLARE done INT DEFAULT 0;  
  10.     # 定义变量  
  11.     DECLARE batchId VARCHAR(40);  
  12.     #定义店铺ID  
  13. #   DECLARE partnerId VARCHAR(40);  
  14.     # 定义光标  
  15.     DECLARE batchIds CURSOR FOR SELECT BATCH_ID  FROM PM_PREPARE_BATCHID WHERE PARTNER_ID = partner AND IS_USED = '0';  
  16.     -- 将结束标志绑定到游标  
  17.   DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;  
  18.       
  19.     -- 打开游标  
  20.     OPEN batchIds;  
  21.         -- 开始循环  
  22.         read_loop:LOOP  
  23.             -- 提取游标中的数据  
  24.             FETCH batchIds INTO batchId;  
  25.               
  26.             -- 退出循环条件  
  27.             IF done THEN  
  28.                 LEAVE read_loop;  
  29.             END IF;  
  30.     #       IF  (batchId IS NOT NULLTHEN  
  31.             IF   (batchId IS NOT NULLTHEN  
  32.                     LEAVE read_loop;  
  33.             END IF;  
  34.   
  35.         -- 结束循环  
  36.         END LOOP read_loop;  
  37.     -- 关闭游标  
  38.     CLOSE batchIds;  
  39.   
  40. #   IF batchId IS NULL THEN  
  41. #       INSERT INTO PM_PREPARE_BATCHID(BATCH_ID, PARTNER_ID, IS_USED, UPDATE_TIME, REMARK)   
  42. #               VALUES(date_format(NOW(),'%Y%m%d%H%i0%s'),partner,'0',NOW(),null);  
  43. #       SELECT BATCH_ID INTO batchId FROM PM_PREPARE_BATCHID WHERE PARTNER_ID = partner AND IS_USED = '0';  
  44. #   END IF;  
  45. #SELECT batchId;  
  46. SET batch  = batchId;  
  47. #SELECT partnerId;  
  48. END  
    4、ZhangT4

[sql]  view plain  copy
  1. CREATE DEFINER=`wpms_test`@`%` PROCEDURE `ZhangT4`()  
  2. BEGIN  
  3.     -- 定义数据  
  4.     DECLARE done INT DEFAULT 0;  
  5.     -- 定义数据  
  6.     DECLARE orderId VARCHAR(50);  
  7.     DECLARE orderTotal int;  
  8.     DECLARE goodsAmount int;  
  9.     DECLARE orderFreight int;  
  10.     -- 游标  
  11.     DECLARE cur CURSOR FOR SELECT ORDER_ID,ORDER_TOTAL,GOODS_AMOUNT,ORDER_FREIGHTINT from PM_OTO_ORDERS_MASTER ;  
  12.         /*    
  13.   
  14.         WHERE ORDER_ID in (  
  15.         '2014090121223423632275694420286',  
  16.         '2014090121255423632275694420287',  
  17.         '2014090121261723632275694420288',  
  18.         '2014090121322123632275694420289',  
  19.         '2014090121324323632275694420290'  
  20.         );  
  21.         */  
  22.     -- 将结束标志绑定到游标  
  23.   DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;  
  24. #Routine body goes here...  
  25.       
  26.     -- 打开游标  
  27.     OPEN cur;  
  28.         -- 开始循环  
  29.         read_loop:LOOP  
  30.             -- 提取游标中的数据  
  31.             FETCH cur into orderId, orderTotal, goodsAmount, orderFreight;  
  32.             -- 什么时候退出该循环  
  33.             IF done THEN  
  34.                 LEAVE read_loop;  
  35.             END IF;  
  36.   
  37.             -- 具体做什么事  
  38.             INSERT INTO Zhang_Test2(ORDER_ID, ORDER_TOTAL, GOODS_AMOUNT, ORDER_FREIGHTINT)  
  39.                 VALUES(orderId, orderTotal, goodsAmount, orderFreight);  
  40.   
  41.   
  42.   
  43.         -- 结束循环  
  44.         END LOOP read_loop;  
  45.     -- 关闭游标  
  46.     CLOSE cur;  
  47.       
  48. END  
    5、ZhangT5

[sql]  view plain  copy
  1. CREATE DEFINER=`wpms_test`@`%` PROCEDURE `ZhangT5`()  
  2. BEGIN  
  3.     #Routine body goes here...   
  4.     #返回批次号  
  5.     -- 定义结束标记  
  6.     DECLARE done INT DEFAULT 0;  
  7.     DECLARE batchId VARCHAR(40);  
  8.     DECLARE batchIds CURSOR FOR SELECT BATCH_ID FROM PM_PREPARE_BATCHID WHERE IS_USED = '0';  
  9.     -- 将结束标志绑定到游标  
  10.   DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;  
  11.       
  12.     -- 打开游标  
  13.     OPEN batchIds;  
  14.         -- 开始循环  
  15.         read_loop:LOOP  
  16.             -- 提取游标中的数据  
  17.             FETCH batchIds INTO batchId;  
  18. #SELECT batchId;  
  19.             -- 退出循环条件  
  20.             IF done THEN  
  21.                 LEAVE read_loop;  
  22.             END IF;  
  23.             IF batchId IS NOT NULL THEN  
  24.                 LEAVE read_loop;  
  25.             END IF;  
  26.   
  27.         -- 结束循环  
  28.         END LOOP read_loop;  
  29.     -- 关闭游标  
  30.     CLOSE batchIds;  
  31.   
  32.     IF batchId IS NULL THEN  
  33.         INSERT INTO PM_PREPARE_BATCHID(BATCH_ID, IS_USED, UPDATE_TIME, REMARK) VALUES(date_format(NOW(),'%Y%m%d%H%i0%s'),'0',NOW(),'说明');  
  34.         SELECT BATCH_ID INTO batchId FROM PM_PREPARE_BATCHID WHERE IS_USED = '0';  
  35.         SELECT batchId;  
  36.     END IF;  
  37. SELECT batchId;  
  38. END  
    6、ZhangT6

[sql]  view plain  copy
  1. CREATE DEFINER=`wpms_test`@`%` PROCEDURE `ZhangT6`()  
  2. BEGIN  
  3.     /*  
  4.     每两秒插入一条数据[不要重复插入已有数据]  
  5.     */  
  6.     -- 定义结束标记  
  7.     DECLARE done1 INT DEFAULT 0;  
  8.     -- 定义标记位,判断量表中的主键是否相等  
  9.     DECLARE flag INT DEFAULT 0;  
  10.     -- 定义变量  
  11.     DECLARE orderId VARCHAR(50);  
  12.     DECLARE orderTotal int;  
  13.     DECLARE goodsAmount int;  
  14.     DECLARE orderFreight int;  
  15.   
  16.     DECLARE orderId1 VARCHAR(50);  
  17. -- DECLARE orderId2 VARCHAR(50);  
  18.     -- 定义游标  
  19.     DECLARE cur1 CURSOR FOR SELECT ORDER_ID from Zhang_Test2;  
  20. -- DECLARE cur2 CURSOR FOR SELECT ORDER_ID from PM_OTO_ORDERS_MASTER;  
  21.     DECLARE cur3 CURSOR FOR SELECT ORDER_ID, ORDER_TOTAL, GOODS_AMOUNT, ORDER_FREIGHTINT from PM_OTO_ORDERS_MASTER ;  
  22.     -- 将结束标志绑定到游标  
  23.   DECLARE CONTINUE HANDLER FOR NOT FOUND SET done1 = 1;  
  24.     #Routine body goes here...  
  25.     -- 打开游标cur3  
  26.     OPEN cur3;  
  27.         -- 开始循环1  
  28.         read_loop1: LOOP  
  29.             -- 提取数据  
  30.             FETCH cur3 INTO orderId, orderTotal, goodsAmount, orderFreight;  
  31.             -- 声明结束的时候  
  32.             IF done1 THEN  
  33.                 LEAVE read_loop1;  
  34.             END IF;  
  35.               
  36. -- select orderId;  
  37.             -- 打开游标1  
  38.             OPEN cur1;  
  39.                 -- 开始循环2  
  40.                 read_loop2: LOOP  
  41.                     -- 提取数据  
  42.                     FETCH cur1 INTO orderId1;  
  43.                     -- 判断null情况  
  44.                     IF orderId1 is null THEN  
  45.                         -- SET orderId1 = 0;  
  46.                         -- 插入一条数据  
  47.                         INSERT INTO Zhang_Test2(ORDER_ID, ORDER_TOTAL, GOODS_AMOUNT, ORDER_FREIGHTINT)  
  48.                             VALUES(orderId, orderTotal, goodsAmount, orderFreight);  
  49.                         -- 退出循环  
  50.                         LEAVE read_loop2;  
  51.                         LEAVE read_loop1;  
  52.                     END IF;  
  53. -- select orderId;  
  54.                     -- 声明结束的时候  
  55.                     IF done1 THEN  
  56.                         SET done1 = 0;  
  57.                         LEAVE read_loop2;  
  58.                     END IF;  
  59.   
  60.                     -- ================具体工作  循环判断:  
  61.                     IF orderId = orderId1 THEN  
  62.                         SET flag = 0;  
  63.   
  64.                         LEAVE read_loop2;  
  65.                     ELSEIF orderId != orderId1 THEN  
  66.                         SET flag = 1;  
  67.   
  68.                     END IF;  
  69.   
  70.   
  71.                 -- 关闭循环2  
  72.                 END LOOP read_loop2;  
  73.             -- 关闭游标1  
  74.             CLOSE cur1;  
  75.   
  76.             -- 具体工作2  
  77.             IF flag = 1 THEN  
  78.                 -- 插入一条数据  
  79.                 INSERT INTO Zhang_Test2(ORDER_ID, ORDER_TOTAL, GOODS_AMOUNT, ORDER_FREIGHTINT)  
  80.                     VALUES(orderId, orderTotal, goodsAmount, orderFreight);  
  81.                 -- 因为是插一条,退出循环  
  82.                 LEAVE read_loop1;  -- 每插入一条数据则推出该循环。如果注释改行,则向表Zhang_Test2插入所有数据  
  83.             END IF;  
  84.   
  85.   
  86.             -- 重置标记flag  
  87.             SET flag = 0;  
  88.         -- 关闭循环1  
  89.         END LOOP read_loop1;  
  90.     -- 关闭游标cur3  
  91.     CLOSE cur3;  
  92.       
  93. END  
    7、ZhangT7

[sql]  view plain  copy
  1. CREATE DEFINER=`wpms_test`@`%` PROCEDURE `ZhangT7`()  
  2. BEGIN  
  3.   
  4.         -- 需要定义接收游标数据的变量   
  5.         DECLARE a CHAR(16);  
  6.         -- 遍历数据结束标志  
  7.         DECLARE done INT DEFAULT FALSE;  
  8.         -- 游标  
  9.         DECLARE cur CURSOR FOR SELECT i FROM test.t;  
  10.         -- 将结束标志绑定到游标  
  11.         DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;  
  12.   
  13.         -- 打开游标  
  14.         OPEN cur;  
  15.         -- 开始循环  
  16.         read_loop: LOOP  
  17.             -- 提取游标里的数据,这里只有一个,多个的话也一样;  
  18.             FETCH cur INTO a;  
  19.             -- 声明结束的时候  
  20.             IF done THEN  
  21.                 LEAVE read_loop;  
  22.             END IF;  
  23.   
  24.             -- 这里做你想做的循环的事件  
  25.             INSERT INTO test.t VALUES (a);  
  26.   
  27.         END LOOP;  
  28.         -- 关闭游标  
  29.         CLOSE cur;  
  30. END  
    8、ZhangT8

[sql]  view plain  copy
  1. CREATE DEFINER=`wpms_test`@`%` PROCEDURE `ZhangT8`(IN `getSeqNum` varchar(1))  
  2. BEGIN  
  3.     #Routine body goes here...  
  4.     #需求获取序列号,格式为:8位日期 + 8位序列号  如2014082100000001  
  5.     #查询时根据当前日期值【如:20140821】  
  6.   
  7.     # 定义最大序号值  
  8.     DECLARE maxSeq VARCHAR(20);  
  9.     # 当前日期值  
  10.     DECLARE nowDate VARCHAR(20);  
  11.       
  12.     # 获取当前日期值  
  13.     set nowDate = (SELECT date_format(NOW(),'%Y%m%d'from dual);  
  14.     # 获取最大序列值  
  15.     SET maxSeq = (SELECT MAX(a.ORDER_ID) from Zhang_Test a where 1=1 and a.order_id LIKE CONCAT('%',nowDate,'%') ); #'%20150623%'  
  16.     #SET maxSeq = 2015062399999888;  
  17.     #SET maxSeq = 2015062399999888+1;       # 99999888  
  18.     #SET maxSeq = maxSeq+1;  
  19.     #SET maxSeq = FORMAT(maxSeq+1,0);  
  20.     # CAST('123' AS SIGNED)  
  21.     #SET maxSeq = CAST(maxSeq as SIGNED)+6;  
  22.     SET maxSeq = maxSeq+0+6;  
  23.     #SET maxSeq = (SELECT MAX(a.TableField) from TableName a where 1=1 and a.TableField LIKE CONCAT('%',nowDate,'%') ); #'%20150623%'  
  24.     #INSERT INTO Zhang_Test (order_id) VALUES(maxSeq);  
  25.     # 获取序列信息  
  26.     SELECT maxSeq ;  
  27.     #SELECT nowDate;  
  28.       
  29.   
  30.   
  31. END  
    9、ZhangT9

[delphi]  view plain  copy
  1. CREATE DEFINER=`wpms_test`@`%` PROCEDURE `ZhangT9`(IN `seqNum` varchar(2))  
  2. BEGIN  
  3.     #Routine body goes here...  
  4.     #需求获取序列号,格式为:8位日期 + 8位序列号  如2014082100000001  
  5.     #根据编号获取对应表的序列值   
  6.     #1 PM_OTO_ORDERS_ACCOUNT  店铺账本表  
  7.     #2 PM_OTO_ORDERS_ACCTLOG  店铺账本记录表  
  8.     #3 PM_OTO_WITHDRAW_PARTNER  店铺提现申请表  
  9.     #4 PM_OTO_WITHDRAW_LOG  店铺提现申请轨迹表  
  10.     #5 PM_OTO_PARTNERS_BANK 店铺银行卡表  
  11.   
  12.     # 定义最大序号值  
  13.     DECLARE maxSeq VARCHAR(20);  
  14.     # 定义当前日期值  
  15.     DECLARE nowDate VARCHAR(20);  
  16.   
  17.     # 获取当前日期值  
  18.     set nowDate = (SELECT date_format(NOW(),'%Y%m%d') from dual);  
  19.   
  20.     if seqNum = '1' THEN  
  21.         #获取今天最大序列值  
  22.         #set maxSeq = (SELECT FORMAT(MAX(a.ACCT_BALANCE_ID)+1,0) from PM_OTO_ORDERS_ACCOUNT a where 1=1 and a.ACCT_BALANCE_ID like CONCAT('%',nowDate,'%'));  
  23.         set maxSeq = (SELECT MAX(a.ACCT_BALANCE_ID) from PM_OTO_ORDERS_ACCOUNT a where 1=1 and a.ACCT_BALANCE_ID like CONCAT('%',nowDate,'%'));  
  24.         if maxSeq IS NOT NULL THEN  # 如果有序列值,那么序列值+1  
  25.             SET maxSeq = CONVERT(maxSeq,SIGNED)+1;  
  26.         end if;  
  27.         if maxSeq IS NULL then  # 如果今天没有序列值,那么设定序列值,从1开始  
  28.             set maxSeq = CONCAT('',nowDate,'00000001');  
  29.         end if;  
  30.         INSERT INTO PM_OTO_ORDERS_ACCOUNT (ACCT_BALANCE_ID) VALUES(CONCAT('',maxSeq,''));       #插入一条数据,以当前序列值为主键,防止主键冲突  
  31.     end if;  
  32.   
  33.     if seqNum = '2' THEN  
  34.         set maxSeq = (SELECT MAX(a.CHARGE_ID) from PM_OTO_ORDERS_ACCTLOG a where 1=1 and a.CHARGE_ID like CONCAT('%',nowDate,'%'));  
  35.         if maxSeq IS NOT NULL THEN    
  36.             SET maxSeq = CONVERT(maxSeq,SIGNED)+1;  
  37.         end if;  
  38.         if maxSeq IS NULL then    
  39.             set maxSeq = CONCAT('',nowDate,'00000001');  
  40.         end if;  
  41.         INSERT INTO PM_OTO_ORDERS_ACCTLOG (CHARGE_ID) VALUES(maxSeq);         
  42.     end if;  
  43.   
  44.     if seqNum = '3' THEN  
  45.         set maxSeq = (SELECT MAX(a.WITHDRAW_ID) from PM_OTO_WITHDRAW_PARTNER  a where 1=1 and a.WITHDRAW_ID like CONCAT('%',nowDate,'%'));  
  46.         if maxSeq IS NOT NULL THEN    
  47.             SET maxSeq = CONVERT(maxSeq,SIGNED)+1;  
  48.         end if;  
  49.         if maxSeq IS NULL then    
  50.             set maxSeq = CONCAT('',nowDate,'00000001');  
  51.         end if;  
  52.         INSERT INTO PM_OTO_WITHDRAW_PARTNER (WITHDRAW_ID) VALUES(maxSeq);  
  53.     end if;  
  54.   
  55.     if seqNum = '4' THEN  
  56.         set maxSeq = (SELECT MAX(a.ID) from PM_OTO_WITHDRAW_LOG  a where 1=1 and a.ID like CONCAT('%',nowDate,'%'));  
  57.         if maxSeq IS NOT NULL THEN    
  58.             SET maxSeq = CONVERT(maxSeq,SIGNED)+1;  
  59.         end if;  
  60.         if maxSeq IS NULL then    
  61.             set maxSeq = CONCAT('',nowDate,'00000001');  
  62.         end if;  
  63.         INSERT INTO PM_OTO_WITHDRAW_LOG (ID) VALUES(maxSeq);  
  64.     end if;  
  65.   
  66.     if seqNum = '5' THEN  
  67.         set maxSeq = (SELECT MAX(a.ID) from PM_OTO_PARTNERS_BANK  a where 1=1 and a.ID like CONCAT('%',nowDate,'%'));  
  68.         if maxSeq IS NOT NULL THEN    
  69.             SET maxSeq = CONVERT(maxSeq,SIGNED)+1;  
  70.         end if;  
  71.         if maxSeq IS NULL then    
  72.             set maxSeq = CONCAT('',nowDate,'00000001');  
  73.         end if;  
  74.         INSERT INTO PM_OTO_PARTNERS_BANK (ID) VALUES(maxSeq);  
  75.     end if;  
  76.   
  77.     SELECT maxSeq;  
  78.   
  79. END  


    10、返回主键信息

[sql]  view plain  copy
  1. CREATE DEFINER=`wpms_test`@`%` FUNCTION `_nextval2`(n varchar(50)) RETURNS varchar(20) CHARSET utf8  
  2. begin    
  3.     ## 需求:返回信息格式:%Y%m%d%H%i%s + 六位数字UUID   
  4.     ## 确保整个库生成数字不冲突  
  5.   
  6.     # 定义当前要返回的序列变量  
  7.     DECLARE nowSeq VARCHAR(20);  
  8.     # 定义当前日期时间信息  
  9.     DECLARE nowDateTime VARCHAR(14);   
  10.     # 定义9位数字随机数  
  11.     DECLARE curNum VARCHAR(6);  
  12.       
  13.     set nowDateTime = (SELECT date_format(NOW(),'%Y%m%d%H%i%s'from dual);   
  14.     set curNum  = (SELECT RIGHT(UUID_SHORT(),6) from dual);  
  15.   
  16.     set nowSeq = (SELECT CONCAT(nowDateTime, curNum) seq from dual);    # 当前时间+ 6位数字UUID  
  17.     return nowSeq;  
  18. end  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL是一个流行的关系型数据库管理系统,支持存储过程,可以用来实现复杂的数据库操作。下面是一个MySQL复杂存储过程示例: 假设我们有两个表:用户表(user)和订单表(order),用户表包含用户的姓名(name)和年龄(age),订单表包含订单号(order_number)和金额(amount)。 我们的目标是创建一个存储过程,根据用户的姓名查询该用户的订单总金额。 首先,我们需要创建这两个表: ``` CREATE TABLE user ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), age INT ); CREATE TABLE order ( id INT AUTO_INCREMENT PRIMARY KEY, user_id INT, order_number VARCHAR(50), amount DECIMAL(10, 2), FOREIGN KEY (user_id) REFERENCES user(id) ); ``` 然后,我们可以创建一个存储过程来实现这个功能: ``` DELIMITER // CREATE PROCEDURE get_order_total_amount(IN user_name VARCHAR(50), OUT total_amount DECIMAL(10, 2)) BEGIN SELECT SUM(amount) INTO total_amount FROM user u JOIN order o ON u.id = o.user_id WHERE u.name = user_name; END; // DELIMITER ; ``` 以上存储过程接受一个输入参数 `user_name`,通过 `JOIN` 来连接用户表和订单表,然后使用 `SUM` 函数计算订单总金额,并将结果保存到输出参数 `total_amount` 中。 我们可以调用这个存储过程来获取特定用户的订单总金额: ``` SET @user_name = '张三'; CALL get_order_total_amount(@user_name, @total_amount); SELECT @total_amount; ``` 以上代码中,我们通过设置用户姓名和定义一个变量来存储订单总金额,并通过调用存储过程来获取结果。 这个示例展示了如何使用MySQL存储过程实现复杂的数据库操作,包括表的创建、存储过程的定义和调用等。存储过程可以帮助我们封装常用的数据库逻辑并提高数据库的性能和安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值