Пример цикла в MySQL

106

В MySQL у меня есть эта хранимая процедура с циклом For в ней:

DELIMITER $$  
CREATE PROCEDURE ABC()

   BEGIN
      DECLARE a INT Default 0 ;
      simple_loop: LOOP
         SET a=a+1;
         select a;
         IF a=5 THEN
            LEAVE simple_loop;
         END IF;
   END LOOP simple_loop;
END $$

Он всегда печатает 1. Каков правильный синтаксис MySQL для цикла?

Читреш
источник
Это создает имена процедур хранения ABC. Какой у вас формат данных (тот, который вы хотите загрузить) ?.
Zimbabao
мне не нужен какой-либо формат данных, я просто хочу напечатать значение от 1 до 5
Chitresh
Я просто попробовал этот код, и он у меня сработал. Мне пришлось добавить CALL ABC (); но это сработало. Я также добавил DROP PROCEDURE ABC () в конце, потому что я запускал ее только в качестве теста.
Алан Стюарт

Ответы:

144
drop table if exists foo;
create table foo
(
id int unsigned not null auto_increment primary key,
val smallint unsigned not null default 0
)
engine=innodb;

drop procedure if exists load_foo_test_data;

delimiter #
create procedure load_foo_test_data()
begin

declare v_max int unsigned default 1000;
declare v_counter int unsigned default 0;

  truncate table foo;
  start transaction;
  while v_counter < v_max do
    insert into foo (val) values ( floor(0 + (rand() * 65535)) );
    set v_counter=v_counter+1;
  end while;
  commit;
end #

delimiter ;

call load_foo_test_data();

select * from foo order by id;
Джон Блэк
источник
Спасибо за ответ, мне помогло. Не могли бы вы также увидеть мой вопрос stackoverflow.com/questions/12259675/… . Мой главный вопрос: нужно ли использовать BEGIN...ENDи создавать процедуру, если я хочу только ее использовать LOOP?
Грин
1
Если у вас возникли проблемы с разделителями, прочтите stackoverflow.com/a/10259528/632951
Pacerier
61

Пример синтаксиса цикла while в MySQL:

delimiter //

CREATE procedure yourdatabase.while_example()
wholeblock:BEGIN
  declare str VARCHAR(255) default '';
  declare x INT default 0;
  SET x = 1;

  WHILE x <= 5 DO
    SET str = CONCAT(str,x,',');
    SET x = x + 1;
  END WHILE;

  select str;
END//

Какие отпечатки:

mysql> call while_example();
+------------+
| str        |
+------------+
| 1,2,3,4,5, |
+------------+

Пример синтаксиса цикла REPEAT в MySQL:

delimiter //

CREATE procedure yourdb.repeat_loop_example()
wholeblock:BEGIN
  DECLARE x INT;
  DECLARE str VARCHAR(255);
  SET x = 5;
  SET str = '';

  REPEAT
    SET str = CONCAT(str,x,',');
    SET x = x - 1;
    UNTIL x <= 0
  END REPEAT;

  SELECT str;
END//

Какие отпечатки:

mysql> call repeat_loop_example();
+------------+
| str        |
+------------+
| 5,4,3,2,1, |
+------------+

Пример синтаксиса цикла FOR в MySQL:

delimiter //

CREATE procedure yourdatabase.for_loop_example()
wholeblock:BEGIN
  DECLARE x INT;
  DECLARE str VARCHAR(255);
  SET x = -5;
  SET str = '';

  loop_label: LOOP
    IF x > 0 THEN
      LEAVE loop_label;
    END IF;
    SET str = CONCAT(str,x,',');
    SET x = x + 1;
    ITERATE loop_label;
  END LOOP;

  SELECT str;

END//

Какие отпечатки:

mysql> call for_loop_example();
+-------------------+
| str               |
+-------------------+
| -5,-4,-3,-2,-1,0, |
+-------------------+
1 row in set (0.00 sec)

Сделайте учебник: http://www.mysqltutorial.org/stored-procedures-loop.aspx

Если я пойму, что вы запускаете в производство такие конструкции MySQL for-loop, я пристрелю вас из пенной ракетной установки. Вы можете использовать трубный ключ, чтобы забить гвоздь, но это заставит вас выглядеть глупо.

Эрик Лещинский
источник
2
Следуя приведенному вами коду, ввод declare str VARCHAR(255) default '';в консоли MySQL (5.6) дает мне сообщение об ошибке Error 1064 (42000): ... for the right syntax to use near '' at line 3, которое ясно, как грязь (хотя я предполагаю, что ему не нравится предложение DEFAULT).
Agi Hammerthief
Раньше он работал в предыдущих версиях. Я думаю, что нужно изменить разделитель конца строки: используйте команду delimiter //перед ее запуском.
Эрик Лещински
Можем ли мы также использовать Iterate и Leave within While? Они действуют как continue и break. Iterate работает аналогично продолжению в java?
Deepak
13

Предположим, у вас есть одна таблица с именем table1. Он содержит один столбец col1 с типом varchar. Запрос к таблице ящиков приведен ниже.

CREATE TABLE `table1` (
    `col1` VARCHAR(50) NULL DEFAULT NULL
)

Теперь, если вы хотите вставить число от 1 до 50 в эту таблицу, используйте следующую хранимую процедуру

DELIMITER $$  
CREATE PROCEDURE ABC()

   BEGIN
      DECLARE a INT Default 1 ;
      simple_loop: LOOP         
         insert into table1 values(a);
         SET a=a+1;
         IF a=51 THEN
            LEAVE simple_loop;
         END IF;
   END LOOP simple_loop;
END $$

Чтобы вызвать эту хранимую процедуру, используйте

CALL `ABC`()
Фатх Рехман П.
источник
1

Вы можете заменить эту локальную переменную на глобальную, так будет проще.

DROP PROCEDURE IF EXISTS ABC;
DELIMITER $$  
CREATE PROCEDURE ABC()

   BEGIN
      SET @a = 0;
      simple_loop: LOOP
         SET @a=@a+1;
         select @a;
         IF @a=5 THEN
            LEAVE simple_loop;
         END IF;
   END LOOP simple_loop;
END $$
Бруно Энрике
источник