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.