Na przykład pętla w MySQL

104

W MySQL mam tę procedurę składowaną z pętlą 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 $$

Zawsze się drukuje 1. Jaka jest poprawna składnia pętli MySQL for?

Chitresh
źródło
Spowoduje to utworzenie nazw procedur składowania ABC. Jaki jest format Twoich danych (taki, który chcesz załadować)?
Zimbabao
nie chcę żadnego formatu danych, chcę tylko wydrukować wartość od 1 do 5
Chitresh
Właśnie wypróbowałem ten kod i zadziałał. Musiałem dodać CALL ABC (); ale zadziałało. Na końcu dodałem również DROP PROCEDURE ABC (), ponieważ uruchamiałem ją tylko jako test.
Alan Stewart

Odpowiedzi:

143
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;
Jon Black
źródło
Dziękuję za odpowiedź, pomogła mi. Czy mógłbyś być tak miły, aby zobaczyć również moje pytanie stackoverflow.com/questions/12259675/… . Moje główne pytanie brzmi: czy konieczne jest użycie BEGIN...ENDi utworzenie procedury, jeśli chcę tylko użyć LOOP?
Green
1
Jeśli masz problemy z separatorami, przeczytaj stackoverflow.com/a/10259528/632951
Pacerier
61

Przykład składni pętli While w 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//

Które wydruki:

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

Przykład składni pętli REPEAT w 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//

Które wydruki:

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

Przykład składni pętli FOR w 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//

Które wydruki:

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

Wykonaj samouczek: http://www.mysqltutorial.org/stored-procedures-loop.aspx

Jeśli przyłapię cię na wprowadzaniu tego rodzaju konstrukcji pętli for MySQL do produkcji, strzelę do ciebie z wyrzutni rakiet piankowych. Możesz użyć klucza do rur, aby wbić gwóźdź, ale takie postępowanie sprawia, że ​​wyglądasz głupio.

Eric Leschinski
źródło
2
Podążając za podanym kodem, wpisanie declare str VARCHAR(255) default '';w konsoli MySQL (5.6) daje mi komunikat o błędzie Error 1064 (42000): ... for the right syntax to use near '' at line 3, który jest jasny jak błoto (chociaż zakładam, że nie podoba mu się klauzula DEFAULT).
Agi Hammerthief
Kiedyś działało we wcześniejszych wersjach. Myślę, że to koniec ogranicznika linii do zmiany: użyj polecenia delimiter //przed uruchomieniem tego.
Eric Leschinski
Czy możemy również używać opcji Iterate i Leave Within While? Działają one jako kontynuacja i zerwanie. Czy Iterate działa podobnie, aby kontynuować w Javie?
Deepak,
13

Załóżmy, że masz jedną tabelę o nazwie „tabela1”. Zawiera jedną kolumnę „col1” z typem varchar. Zapytanie do tabeli skrzynek podano poniżej

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

Teraz, jeśli chcesz wstawić liczbę od 1 do 50 w tej tabeli, użyj następującej procedury składowanej

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

Aby wywołać tę procedurę składowaną, użyj

CALL `ABC`()
Fathah Rehman P.
źródło
1

Możesz zamienić tę lokalną zmienną na globalną, byłoby łatwiej.

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 $$
Bruno Henrique
źródło