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;