Что является альтернативой курсору mysql?

0

По моим сведениям, единственным использованием курсора является выбор значений один за другим из стека для каждой выборки

В сценарии оболочки такой же может быть достигнут с использованием цикла 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
          $$
Теги:
stored-procedures
scripting

1 ответ

1

Для хранимых процедур 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%';
  • 0
    Привет, спасибо за это, но если мне нужно добиться того же цикла for / while без курсора, каков синтаксис? так же, как это возможно в вышеупомянутом синтаксисе сценария оболочки.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню