什么是mysql游标的替代?

2admgd59  于 2023-05-28  发布在  Mysql
关注(0)|答案(1)|浏览(161)

据我所知,游标的唯一用途是从堆栈中逐个拾取值,用于每次获取
在shell脚本中,同样可以使用FOR或WHILE循环来实现。
示例:

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

(或)

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

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

如何在mysql程序中实现相同的没有游标和使用FOR(或)WHILE循环。
以下是使用光标的程序示例。我只想在下面的程序中应用解决方案。

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
  $$
cyvaqqii

cyvaqqii1#

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%';

相关问题