Pytanie Przykład pętli w MySQL


W MySQL mam tę procedurę przechowywaną z pętlą For w tym:

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 drukuje 1. Jaka jest poprawna składnia pętli MySQL for?


76
2018-02-26 04:35


pochodzenie


Spowoduje to utworzenie nazw procedur składowania ABC. Jaki jest twój format danych (taki, który chcesz wczytać) ?. - Zimbabao
nie chcę żadnego formatu danych, chcę tylko wydrukować wartość od 1 do 5 - Chitresh


Odpowiedzi:


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;

113
2018-02-26 11:36



Dziękuję za odpowiedź, pomogło mi to. Czy możesz być tak miły, aby zobaczyć moje pytanie stackoverflow.com/questions/12259675/.... Moje główne pytanie brzmi: czy konieczne jest użycie? BEGIN...END i utworzyć procedurę, jeśli chcę tylko użyć LOOP? - Green
Jeśli masz problemy z ogranicznikami, czytać stackoverflow.com/a/10259528/632951 - Pacerier


Chociaż przykład składni pętli 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óry drukuje:

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óry drukuje:

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óry drukuje:

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 złapię cię, pchając tego rodzaju konstrukcje pętli MySQL do produkcji, zamierzam zastrzelić cię wyrzutnią rakietową. Możesz użyć klucza do rur, aby uderzyć w gwóźdź, ale dzięki temu będziesz wyglądać głupio.


44
2017-12-25 05:05



Podążając za podanym kodem, pisząc declare str VARCHAR(255) default ''; w konsoli MySQL (5.6) wyświetla się komunikat o błędzie Error 1064 (42000): ... for the right syntax to use near '' at line 3, który jest tak czysty jak błoto (chociaż zakładam, że nie podoba mu się klauzula DEFAULT). - Agi Hammerthief
Wcześniej pracował w poprzednich wersjach. Myślę, że to koniec ogranicznika linii do zmiany: użyj polecenia delimiter // przed uruchomieniem tego. - Eric Leschinski
Czy możemy używać Iterate i pozostawić w czasie, gdy również? Działają one jako kontynuacja i zerwanie. Czy Iterate działa podobnie do kontynuacji w java? - Deepak


Załóżmy, że masz jedną tabelę o nazwie "table1". 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ę przechowywaną użyj

CALL `ABC`()

10
2017-10-11 11:58