mysql 游标 游标嵌套

一 、单个游标使用:

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

 

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ma_xs

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

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

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

打赏作者

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

抵扣说明:

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

余额充值