【问题标题】:What is alternate to the mysql cursor?什么是mysql游标的替代品?
【发布时间】:2018-02-14 05:32:30
【问题描述】:

据我所知,游标的唯一用途是从堆栈中为每个 fetch 逐个选取值

在 shell 脚本中,同样可以使用 FOR 或 WHILE 循环来实现。

例子:

               while read ip; 
               do 
               echo $ip
               done < ./test.txt

     (OR)
              IFS=$'\n'
               for ip in $(cat ./test.txt)
                 do
                   echo "$ip"
                done

这里如果 test.txt 有多行,那么对于一次迭代,一行将被加载到变量 ip。

如何在没有游标和使用 FOR(或)WHILE 循环的 mysql 过程中实现相同的功能。

以下是使用游标的过程示例。我只想在以下过程中应用解决方案。

           delimiter $$
             create procedure Replace_URL_IP()
            begin
            declare finished varchar(20);
            declare ip varchar(20);
            declare c1 cursor for select SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(VALUE,'/',3),'//',-1),':',1) IP from rbt_parameters where PARAM like '%URL%' and VALUE like 'http%';
           declare continue handler for NOT FOUND set finished=1;
           open c1;
           start_loop: loop
               fetch c1 into ip;
                      update rbt_parameters set value=replace(value,ip,'127.0.0.1') where PARAM like '%URL%' and VALUE like 'http%';
                      if finished=1 then
                      leave start_loop;
                      end if;
                      end loop;
          close c1;
          end
          $$

【问题讨论】:

    标签: mysql sql shell stored-procedures scripting


    【解决方案1】:

    MySQL 存储过程中没有用于迭代查询结果的 for/while 循环结构。您使用光标显示示例,这是唯一的方法。有人要求使用更简单的语法(例如 https://bugs.mysql.com/bug.php?id=68758),但到目前为止还没有为 MySQL 实现。

    也许您会发现用应用程序编程语言而不是 MySQL 存储过程编写代码更有效率。说实话,我不喜欢 MySQL 存储过程,也不会使用它们。

    在您展示的示例中,您可以在存储过程中使用的一种替代方法是使用 UPDATE 语句将更改应用于匹配集中的所有行:

    UPDATE rbt_parameters
    SET VALUE = REPLACE(VALUE,
      SUBSTRING_INDEX(
        SUBSTRING_INDEX(
          SUBSTRING_INDEX(value, '/', 3),
          '//', -1),
        ':', 1),
      '127.0.0.1')
    WHERE PARAM LIKE '%URL%' AND VALUE LIKE 'http%';
    

    【讨论】:

    • 您好,谢谢,但如果我必须在不使用光标的情况下使用 for/while 循环来实现相同的效果,语法是什么?与上述 shell 脚本语法中的可行方式相同。
    猜你喜欢
    • 2012-01-01
    • 2019-02-22
    • 2011-05-07
    • 2012-04-24
    • 2019-12-03
    • 2010-09-17
    • 2012-03-27
    • 2012-09-30
    • 2010-10-20
    相关资源
    最近更新 更多