MySQL函数案例

函数实例

CREATE DEFINER=`root`@`%` PROCEDURE `query_recipes`(timePeriod varchar(50),mealType varchar(2))
    COMMENT '根据时间筛选和餐次类型查询所有菜品表数据 * @param timePeriod 时间段 * @param mealType   餐次类型 0早餐/1午餐/2晚餐 没有则查全部'
BEGIN
  DECLARE dishes_ids VARCHAR(1000) DEFAULT '';
	DECLARE dishes_ids_str VARCHAR(1000) DEFAULT '';
	DECLARE dishes_ids_count int(11) DEFAULT 0;
  DECLARE i int(11) DEFAULT 0;
  DECLARE dishes_id bigint(20);

set @selectSql =  concat("select group_concat(DISTINCT dishes_id) as dishes_ids_str into @dishes_ids_str from tmd_menus WHERE date_format(menu_usage_time, '%Y-%m-%d') = '",timePeriod,"'");
	if(mealType <> '') THEN
		set @selectSql = concat(@selectSql," and meal_type = ",mealType);
	END IF;

 PREPARE stmt FROM @selectSql;
 EXECUTE stmt ;
 DEALLOCATE PREPARE stmt;
 set @dishes_ids = replace(replace(@dishes_ids_str,'[',''),']','');
--  拼接字符串去重
 select pscs.separator_str_distinct(@dishes_ids,',') into @dishes_ids;
 set @dishes_ids_count= 1+(length(@dishes_ids) - length(replace(@dishes_ids,',','')));
 DROP TEMPORARY TABLE IF EXISTS tmd_provisional_list_dishes;

  CREATE TEMPORARY TABLE tmd_provisional_list_dishes (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `create_date` datetime NOT NULL COMMENT '创建时间',
  `modify_date` datetime NOT NULL COMMENT '修改时间',
  `dishes_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '菜品名称',
  `photo` varchar(400) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '菜品照片',
  `remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '菜品备注',
  `company_id` bigint(20) NULL DEFAULT NULL COMMENT '公司id',
  `company_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '公司名称',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 200 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '菜品临时表' ROW_FORMAT = Dynamic;

	while i < @dishes_ids_count
	do
		set i = i + 1;

		SELECT SUBSTRING_INDEX((SELECT SUBSTRING_INDEX(@dishes_ids, ',' , i)), ',' , -1) into @dishes_id;

    INSERT INTO tmd_provisional_list_dishes (create_date,modify_date,id,dishes_name,photo,remark,company_id,company_name) 
		select create_date,modify_date,id,dishes_name,photo,remark,company_id,company_name from tmd_dishes di where di.id = @dishes_id;
-- 
  end while;
-- 	select @selectSql;
	select * from tmd_provisional_list_dishes;
END

根据下标获取指定位置的字符

CREATE DEFINER=`root`@`%` FUNCTION `separator_str`(str VARCHAR(225), separator_str CHAR(1), idx int(10)) RETURNS varchar(50) CHARSET utf8
    COMMENT '根据下标获取指定位置的字符'
BEGIN
    RETURN SUBSTRING_INDEX(SUBSTRING_INDEX(str, separator_str, idx), separator_str, -1);
END

获取去重字符串

CREATE DEFINER=`root`@`%` FUNCTION `separator_str_distinct`(str VARCHAR(225), separator_str CHAR(1)) RETURNS varchar(225) CHARSET utf8
    COMMENT '获取去重字符串'
BEGIN
    DECLARE size INT DEFAULT separator_str_len(str, separator_str);
    DECLARE i INT DEFAULT 0;
    DECLARE tmp VARCHAR(50);
    DECLARE str_distinct VARCHAR(225) DEFAULT '';
    WHILE i < size DO
        SET i = i + 1;
        SET tmp = separator_str(str, separator_str, i);
        SET str_distinct = if(FIND_IN_SET(tmp, str_distinct) > 0, str_distinct, CONCAT(str_distinct, separator_str, tmp));
    END WHILE;
    RETURN RIGHT(str_distinct, CHAR_LENGTH(str_distinct) - 1);
END

获取分割后的字符串数量

CREATE DEFINER=`root`@`%` FUNCTION `separator_str_len`(str VARCHAR(225), separator_str CHAR(1)) RETURNS int(10)
    COMMENT '获取分割后的字符串数量'
BEGIN
    RETURN (LENGTH(str) - LENGTH(REPLACE(str, separator_str, '')))+1;
END

函数事务实例

CREATE DEFINER=`root`@`%` PROCEDURE `update_order_food_flag_amount`(`creation_time` varchar(50))
BEGIN
	DECLARE id int DEFAULT 0;
	-- 定义一个错误的变量,类型是整形,默认是0
  DECLARE t_error INTEGER DEFAULT 0;
	
  -- 捕获到sql的错误,就设置t_error为1
  DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1;
  -- 开启事务
  START TRANSACTION;

	insert into aged_user(creation_time) VALUES (creation_time);
	SELECT LAST_INSERT_ID() INTO @id;
			
			update aged_user set aged_user_name = '行';
			
	-- 如果捕获到错误
  IF t_error=1 THEN
     -- 回滚
     ROLLBACK;
  ELSE
     -- 提交
     COMMIT;
  END IF;
  -- 查看返回的结果,并给到输出的变量中
  SELECT t_error;
-- 
END

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值