mysql函数、游标一般用法

1最大众化的场景:生成x条数据

1
--创建视图
CREATE PROCEDURE generate_dates()
--进入循环
BEGIN
  DECLARE i INT DEFAULT 1;
  
  WHILE i <= 214 DO
    INSERT INTO dates (date)
    SELECT DATE_ADD(MAX(date), INTERVAL 1 DAY)
    FROM dates;
    
    SET i = i + 1;
  END WHILE;
END 

2
调用视图
CALL generate_dates();

2遍历整张表对每条记录进行操作

1
DROP PROCEDURE IF EXISTS test_update;
2
create PROCEDURE test_update ()
begin
# 声明自定义变量
DECLARE tempUserId varchar(32);
DECLARE osTypeKeyList varchar(1000);
# 声明游标结束变量
DECLARE done INT DEFAULT 0;
# 声明游标 cr 以及游标读取到结果集最后的处理方式
DECLARE cur CURSOR FOR SELECT    a,b FROM tableqa;
DECLARE continue handler for not found set done = 1;
# 打开游标
OPEN cur;
	
# 循环
  users_loop: LOOP
     # 获取游标中值并赋值给变量
     FETCH cur INTO osTypeKeyList,tempUserId;
     # 判断游标是否到底,若到底则退出游标
     # 需要注意这个判断
     IF done=1 THEN
         LEAVE users_loop;
     END IF;
     # 每一条要执行的操作
		Update tableqa SET a='abc123' WHERE b=tempUserId;
  END LOOP users_loop;
-- 关闭游标
CLOSE cur;
end;
# 最后重新定义为;
--delimiter ;
3
# 执行存储过程
call test_update;

遍历整张表为每一条记录生成uuid(小写,无连字符)

CREATE PROCEDURE add_uuid()

BEGIN
  DECLARE i INT DEFAULT 1;
  
  WHILE i <= 1948 DO
--     INSERT INTO project_group_hwid_mapping_copy3_copy1 (group_root_uuid)
-- 		replace(uuid(),"-","")
    UPDATE project_group_hwid_mapping_copy3_copy1 SET group_root_uuid = replace(uuid(),"-","");

    SET i = i + 1;
  END WHILE;
END 
 
CALL add_uuid();

3函数的使用

1创建函数(删除字符串中出现的重复字符)
CREATE FUNCTION remove_duplicate_values(val VARCHAR(500)) 
RETURNS VARCHAR(255)
BEGIN
    DECLARE result VARCHAR(255) DEFAULT '';
    DECLARE arr VARCHAR(255) DEFAULT '';
    DECLARE i INT DEFAULT 0;
    DECLARE val_len INT DEFAULT 0;
    DECLARE sub_val VARCHAR(255);

    SET arr = replace(val, ',', ',');
    SET val_len = CHAR_LENGTH(arr);

    WHILE i < val_len DO
        SET sub_val = SUBSTRING_INDEX(SUBSTRING_INDEX(arr, ',', i + 1), ',', -1);
        IF NOT FIND_IN_SET(sub_val, result) THEN
            SET result = CONCAT(result, sub_val, ',');
        END IF;
        SET i = i + 1;
    END WHILE;
    SET result = TRIM(TRAILING ',' FROM result);
    RETURN result;
END;

2测试函数是否生效
select remove_duplicate_values("a,b,c,a"

4使用游标遍历整张表并且在循环的时候使用函数

1
DROP PROCEDURE IF EXISTS test_update;
2
create PROCEDURE test_update ()
begin
# 声明自定义变量
DECLARE tempUserId varchar(32);
DECLARE osTypeKeyList varchar(1000);
# 声明游标结束变量
DECLARE done INT DEFAULT 0;
# 声明游标 cr 以及游标读取到结果集最后的处理方式
DECLARE cur CURSOR FOR SELECT  a,b FROM tableb;
DECLARE continue handler for not found set done = 1;
# 打开游标
OPEN cur;
	
# 循环
  users_loop: LOOP
     # 获取游标中值并赋值给变量
     FETCH cur INTO osTypeKeyList,tempUserId;
     # 判断游标是否到底,若到底则退出游标
     # 需要注意这个判断
     IF done=1 THEN
         LEAVE users_loop;
     END IF;
     # 需要执行的语句
--      update tb_cpl_user_info 
-- 		 set CHANNEL ='abc123' 
-- 		 WHERE user_id = tempUserId;
		Update tablebSET a=remove_duplicate_values(osTypeKeyList)  WHERE b=tempUserId;
  END LOOP users_loop;
-- 关闭游标
CLOSE cur;
end,
# 最后重新定义为;
--delimiter ;
3
# 执行存储过程
call test_update;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

耳东哇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值