DROP PROCEDURE IF EXISTS `staff_zt_test`;
CREATE PROCEDURE `staff_zt_test`()
BEGIN
-- 查询t_user
-- 该变量用于标识是否还有数据需遍历
DECLARE flag INT DEFAULT 0;
-- 创建一个变量用来存储遍历过程中的值
DECLARE user_id INT(40) DEFAULT 0;
DECLARE user_name VARCHAR(200) DEFAULT '';
DECLARE user_id_card_type VARCHAR(200) DEFAULT '';
DECLARE user_represent_job_info VARCHAR(200) DEFAULT '';
-- declare 声明参数,default:设置声明参数的默认值
-- 查询出需要遍历的数据集合
DECLARE userList CURSOR FOR (select id,user_name,id_card_type,represent_job_info from t_user where represent_job_info is not null);
-- 查询是否有下一个数据,没有将标识设为1,相当于hasNext
DECLARE CONTINUE HANDLER FOR NOT FOUND SET flag = 1;
-- 打开游标
OPEN userList;
-- 取值设置到临时变量中
FETCH userList INTO user_id,user_name,user_id_card_type,user_represent_job_info;
-- 遍历未结束就一直执行
WHILE flag != 1 DO
-- targetSQL //你想要执行的目标功能,这里可以写多个SQL
-- 注意
-- 这里有一个坑,目标语句引用临时变量,实测发现不需要加@符号,但是搜索到的结果都是例如:@id ,这样来使用,实测发现无法取到数据
-- 注意
-- >>>>>>
-- 2103 001 第十三届全国人大代表
-- 2104 002 山东省第十三届人大代表
-- 2105 003 德州市第十八届人大代表
-- 2128 004 德州市第十九届人大代表
-- 判断user_represent_job_info是否包含’2128‘
if LOCATE('2128',user_represent_job_info)>0 then
INSERT INTO t_representative_session
( t_user_id, user_name, session, start_time, end_time, status, level, remark, session_description, status_description, create_date)
VALUES
(user_id, user_name, '2128', '2022-02-24 00:00:00', '2022-02-25 00:00:00', '2130', user_id_card_type, 'SQL生成', '德州市第十九届人大代表', '在任',now());
end if;
if LOCATE('2103',user_represent_job_info)>0 then
INSERT INTO t_representative_session
( t_user_id, user_name, session, start_time, end_time, status, level, remark, session_description, status_description, create_date)
VALUES
(user_id, user_name, '2103', '2022-02-24 00:00:00', '2022-02-25 00:00:00', '2131', user_id_card_type, 'SQL生成', '第十三届全国人大代表', '不在任',now());
end if;
if LOCATE('2104',user_represent_job_info)>0 then
INSERT INTO t_representative_session
( t_user_id, user_name, session, start_time, end_time, status, level, remark, session_description, status_description, create_date)
VALUES
(user_id, user_name, '2104', '2022-02-24 00:00:00', '2022-02-25 00:00:00', '2131', user_id_card_type, 'SQL生成', '山东省第十三届人大代表', '不在任',now());
end if;
if LOCATE('2105',user_represent_job_info)>0 then
INSERT INTO t_representative_session
( t_user_id, user_name, session, start_time, end_time, status, level, remark, session_description, status_description, create_date)
VALUES
(user_id, user_name, '2105', '2022-02-24 00:00:00', '2022-02-25 00:00:00', '2131', user_id_card_type, 'SQL生成', '德州市第十八届人大代表', '不在任',now());
end if;
-- 一定要记得把游标向后移一位,这个坑我替各位踩过了,不需要再踩了
FETCH userList INTO user_id,user_name,user_id_card_type,user_represent_job_info;
END WHILE;
CLOSE userList;
END;
知识点:
- MySql创建存储过程
- 游标使用以及遍历
https://blog.csdn.net/otherhy/article/details/100336243
- locate()函数的使用
LOCATE(substr,str):判断是否包含某字符串,如果包含将返回>0的数值,否则,返回0;
- 逻辑判断的使用
IF num = 0 THEN
-- 逻辑
-- ElSE 可不写
ELSE
-- 逻辑
end if;
- 调用存储过程
call 存储过程名字();
注意事项
- MySql中没有 print() 打印语句, select 1; 类似打印输入也不好用
- MySql中存储过程没有Return,函数Function 有Return