一 、单个游标使用:
CREATE DEFINER=`root`@`%` FUNCTION `replaceWord`(content mediumtext) RETURNS mediumtext CHARSET utf8
DETERMINISTIC
BEGIN
#定义变量
declare old_value VARCHAR(500);
declare done int default 0;
#创建游标
declare cur cursor for select attr_value from table1;
#游标中的内容执行完后将done设置为1
declare CONTINUE HANDLER FOR NOT FOUND SET done=1;
#打开敏感词游标
open cur;
#执行循环
posLoop:LOOP
#判断是否结束循环
IF done=1 THEN
LEAVE posLoop;
END IF;
#取游标中的值
FETCH cur into old_value;
#执行更新操作
if old_value is not null and done = 0 then
set content = replace(content,old_value,'');
end if;
END LOOP posLoop;
#释放游标
CLOSE cur;
RETURN content;
END
二、游标嵌套
重点:
1、存储过程中游标公用一个结束标识(done)
declare CONTINUE HANDLER FOR NOT FOUND SET done=1;
2、内嵌游标结束后一定要把结束标识设置回去;
set done =0;
嵌套实例:
CREATE DEFINER=`root`@`%` FUNCTION `replaceWord`(content mediumtext) RETURNS mediumtext CHARSET utf8
DETERMINISTIC
BEGIN
#定义变量
declare old_id bigint;
declare old_value VARCHAR(500);
declare done int default 0;
#创建游标
declare cur cursor for select id,attr_value from table1;
#创建嵌套游标
declare table2_cur cursor for select attr2_value from table2 t2 where t2.parent_id = old_id;
#游标中的内容执行完后将done设置为1
declare CONTINUE HANDLER FOR NOT FOUND SET done=1;
#打开敏感词游标
open cur;
#执行循环
posLoop:LOOP
#判断是否结束循环
IF done=1 THEN
LEAVE posLoop;
END IF;
#取游标中的值
FETCH cur into old_id,old_value;
#执行更新操作 这里要加判断 done=0 则执行,FETCH 抓取无数据 则会把done 设置为1 ,不知道把if done =1 then 判断放到 FETCH下方是否会解决这个问题 ,有空可以测试一下
if old_value is not null and done = 0 then
set content = replace(content,old_value,'');
#打开敏感词游标
open table2_cur;
#执行循环
tableLoop:LOOP
#判断是否结束循环
IF done=1 THEN
LEAVE tableLoop;
END IF;
#取游标中的值
FETCH table2_cur into old_value;
#执行更新操作
if old_value is not null and done = 0 then
set content = replace(content,old_value,'');
end if;
END LOOP tableLoop;
#释放游标
CLOSE table2_cur;
#一定要设置done为0,否则外层游标也会停止循环
set done = 0;
end if;
END LOOP posLoop;
#释放游标
CLOSE cur;
RETURN content;
END