По моим сведениям, единственным использованием курсора является выбор значений один за другим из стека для каждой выборки
В сценарии оболочки такой же может быть достигнут с использованием цикла 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 имеет несколько строк, то для одной итерации одна строка будет загружена в varible 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
$$
Для хранимых процедур MySQL нет/для структуры цикла 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%';