Beispiel für eine Schleife in MySQL


104

In MySQL habe ich diese gespeicherte Prozedur mit einer For-Schleife:

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

Es wird immer gedruckt 1. Was ist die richtige Syntax für eine MySQL for-Schleife?


Dadurch werden die Namen der Speicherprozeduren ABC erstellt. Was ist Ihr Datenformat (eines, das Sie laden möchten)?.
— Simbabao

Ich möchte kein Datenformat, ich möchte nur einen Wert von 1 bis 5
— drucken

Ich habe gerade diesen Code ausprobiert und er hat bei mir funktioniert. Ich musste CALL ABC () hinzufügen; aber es hat funktioniert. Ich habe am Ende auch DROP PROCEDURE ABC () hinzugefügt, weil ich es nur als Test ausgeführt habe.
— Alan Stewart

Antworten:


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;

Vielen Dank für Ihre Antwort, es hat mir geholfen. Könnten Sie so nett sein, auch meine Frage stackoverflow.com/questions/12259675/… zu sehen . Meine Hauptfrage ist, BEGIN...ENDob es notwendig ist, eine Prozedur zu verwenden und zu erstellen, wenn ich sie nur verwenden möchte LOOP.
— Grün

1
Wenn Sie Probleme mit Trennzeichen haben, lesen Sie stackoverflow.com/a/10259528/632951
— Pacerier

61

Beispiel für eine While-Schleifensyntax in 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//

Welche Drucke:

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

Beispiel für die REPEAT-Schleifensyntax in 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//

Welche Drucke:

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

Beispiel für eine FOR-Schleifensyntax in 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//

Welche Drucke:

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

Führen Sie das Tutorial aus: http://www.mysqltutorial.org/stored-procedures-loop.aspx

Wenn ich Sie dabei erwische, wie Sie diese Art von MySQL-For-Loop-Konstrukten in die Produktion bringen, werde ich Sie mit dem Schaumstoff-Raketenwerfer erschießen. Sie können einen Rohrschlüssel verwenden, um einen Nagel einzuschlagen, aber wenn Sie dies tun, sehen Sie albern aus.


2
Wenn Sie dem von Ihnen angegebenen Code folgen declare str VARCHAR(255) default '';und die MySQL (5.6) -Konsole eingeben , wird die Fehlermeldung angezeigt Error 1064 (42000): ... for the right syntax to use near '' at line 3, die so klar wie Schlamm ist (obwohl ich davon ausgehe, dass die DEFAULT-Klausel nicht gefällt).
— Agi Hammerthief

Früher funktionierte es in früheren Versionen. Ich denke, es ist das Zeilenende-Trennzeichen, das geändert werden muss: Verwenden Sie den Befehl, delimiter //bevor Sie diesen ausführen.
— Eric Leschinski

Können wir auch Iterate und Leave in While verwenden? Diese wirken als Fortsetzung und Unterbrechung. Funktioniert Iterate ähnlich wie in Java?
— Deepak

13

Angenommen, Sie haben eine Tabelle mit dem Namen 'table1'. Es enthält eine Spalte 'col1' vom Typ varchar. Die Abfrage zur Kistentabelle ist unten angegeben

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

Wenn Sie nun eine Zahl von 1 bis 50 in diese Tabelle einfügen möchten, verwenden Sie die folgende gespeicherte Prozedur

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

Um diese gespeicherte Prozedur aufzurufen, verwenden Sie

CALL `ABC`()

1

Sie können diese lokale Variable gegen eine globale austauschen, es wäre einfacher.

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 $$
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.